2012-10-05 67 views
7

Trong bảng DB, tôi có một số trường với datetime làm loại trường. Vì vậy, tôi cần phải duy trì dữ liệu chỉ là đối tượng ngày tháng.Cách tạo đối tượng DateTime từ chuỗi trong symfony2/php

Từ một hình thức tôi nhận được ngày thời gian như chuỗi như

2012-10-05 17:45:54 

Bây giờ khi đã bao giờ tôi vẫn tồn tại thực thể của tôi tôi nhận được lỗi sau:

Fatal error: Call to a member function format() on a non-object in ..\DateTimeType.php on line 44

Tôi đã thử với

$protocol->setStartedAt(strtotime($post['started_at'])); 

hoặc

$from = \DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']); 
$protocol->setStartedAt($from); 

hoặc chỉ

$from = new \DateTime($post['started_at']); 
$protocol->setStartedAt($from); 

Các công trình đang cuối cùng nhưng nó không sử dụng dấu thời gian trôi qua như đối số nhưng chỉ được thời gian hiện tại.

Bất kỳ ý tưởng nào?

+0

Bạn có chắc chắn '$ post ['started_at']' chứa nội dung bạn muốn không? Nó không phải là '$ _POST ['started_at']'? –

+0

Ngoài ra, đối tượng 'DateTime' và các phương thức ném ngoại lệ về lỗi. Bạn có nhận được không ai trong số đó? Thử sử dụng 'try/catch'. –

Trả lời

12

tôi luôn tạo đối tượng DateTime với constructor của nó, os trong trường hợp của bạn nó sẽ là:

$protocol->setStartedAt(new \DateTime($post['started_at'])); 

nếu làm việc này, nhưng không sử dụng dấu thời gian gửi bạn có thể làm không có giá trị trong $ post ['started_at']. Hãy thử debuging nó hoặc chỉ làm các trick bẩn:

die($post['started_at']); 
+0

Gỡ lỗi khác: 'var_dump' kết quả của' new DateTime() 'và nếu nó sử dụng sai 'var_dump (\ DateTime :: getLastErrors())' để biết thêm chi tiết. http://php.net/manual/en/datetime.getlasterrors.php – yoshi

+0

Tại sao dấu gạch chéo ngược? Vì vậy, symfony không giải thích nó? – meles

+0

Bạn có thể thêm DateTime với câu lệnh '' 'use''', sau đó không cần dùng dấu gạch chéo ngược. Nếu không, bạn phải khai báo đường dẫn đầy đủ đến lớp, trong trường hợp này nó nằm trong vùng tên mặc định, do đó chỉ cần dấu gạch chéo ngược là cần thiết. –

1

Làm thế nào về createFromFormat?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s'); 
+0

Rất tiếc, chỉ thấy bạn đã có điều này - nó không hoạt động vì định dạng có vẻ không chính xác. Hãy thử sử dụng trang được liên kết để khớp chính xác định dạng của bạn - đó là định dạng của PHP, không phải là một giao diện lạ ... – watermanio

+0

Không, vẫn gặp lỗi này, Gọi tới định dạng hàm thành viên() trên dòng DateTimeType.php không đối tượng 44 –

+0

Giải pháp trên là sai. Giải pháp đúng = '$ from = \ DateTime :: createFromFormat ('Ymd H: i: s', $ post ['started_at']);' –

8

Vì lợi ích của độc giả tương lai người chắc chắn một ngày nào đó sẽ gặp phải vấn đề này (đây là bài viết đầu tiên nếu bạn google "symfony 2 datetime từ chuỗi"), hãy nhớ rằng trong Symfony 2 đối tượng DateTime KHÔNG chấp nhận một chuỗi với định dạng đó: "d/m/Y H:i:s" và có lẽ cũng không hỗ trợ nhiều loại khác.

Vì lợi ích của việc không trở thành điên lúc đó, tôi đã thực sự phát hiện ra rằng giải pháp dễ nhất và an toàn nhất để tránh sai sót như vậy là cái này:

Đầu tiên, có được ngày của bạn chuỗi từ bất cứ loại yêu cầu bạn đang làm (Trong trường hợp của tôi một yêu cầu AJAX chung) và chuyển đổi nó thành một đối tượng DateTimePicker DateTime, ví dụ này giả định rằng chúng ta cần phải tạo một đối tượng dateTime cho 25/04/2015 15:00, là định dạng của jQuery UI italian DateTimePicker (đó chỉ là một ví dụ):

$literalTime = \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00"); 

(lưu ý: sử dụng \ sử dụng đối tượng DateTime php, nếu không bạn sẽ được sử dụng đối tượng datetime Symfony rằng sẽ ném bạn một ngoại lệ)

Sau đó, một khi bạn đã làm điều đó, tạo ra một chuỗi ngày sử dụng sự thoải mái định dạng chức năng, bằng cách cho vào tham số đầu tiên định dạng đầu ra mong đợi (Y-m-d H:i:s):

$expire_date = $literalTime->format("Y-m-d H:i:s"); 

bằng cách này bạn chắc chắn 100% rằng bất cứ loại định dạng mà bạn đang đi hoặc nhận này sẽ đúng là conve rted và bạn sẽ không nhận được bất kỳ loại ngoại lệ nào từ đối tượng symfony DateTime, miễn là bạn cung cấp những gì bạn đang mong đợi làm đầu vào.

Biết rằng bài đăng này thực sự khá cũ, tôi đã quyết định đăng bài đó bởi vì tôi không tìm thấy bất kỳ nguồn có giá trị nào khác nhưng điều này để hiểu vấn đề có thể xảy ra ở đâu. Xin lưu ý rằng giải pháp tốt nhất vẫn là gửi chuỗi ngày giờ theo định dạng chính xác, nhưng nếu bạn thực sự không có cách nào để làm điều đó, cách an toàn nhất để chuyển đổi chuỗi đó là chuỗi ở trên.

Các vấn đề liên quan