2012-10-05 115 views
7

在數據庫表中,我有幾個字段,其中datetime作爲字段類型。所以我只需要將數據保存爲日期時間對象。如何從symfony2/php中的字符串創建DateTime對象

從形式我得到的日期時間字符串如

2012-10-05 17:45:54 

現在,當過我堅持我的實體我獲得以下錯誤:

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

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

嘗試或

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

或只是

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

最後一個代碼的作品,但它並沒有採用如arguement傳入的時間戳,但只是獲取當前時間。

任何想法?

+0

確定'$信息[「started_at」]'包含你希望它是什麼?它不是'$ _POST ['started_at']'? –

+0

另外,DateTime對象和方法在錯誤上拋出異常。你沒有得到這些嗎?嘗試使用'try/catch'。 –

回答

12

我總是與它的構造函數創建DateTime對象,操作系統在你的情況將是:

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

如果這個工程,但不使用時間戳貼出你可能做的沒有$ post ['started_at']中的值。試着調試運行,或只是做骯髒的伎倆:

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

更多調試:'var_dump'的'新的DateTime()的結果'和如果它是false,請使用'var_dump(\ DateTime :: getLastErrors())'獲取更多細節。 http://php.net/manual/en/datetime.getlasterrors.php – yoshi

+0

爲什麼是反斜槓?所以symfony不解釋它? – meles

+0

您可以使用''use'''語句添加DateTime,則不需要反斜槓。否則,你必須聲明類的完整路徑,在這種情況下,它是在默認的命名空間,所以只需要反斜槓。 –

1

如何createFromFormat?

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

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

對不起,剛看到你已經有這個 - 它不工作,因爲格式看起來不正確。嘗試使用鏈接的頁面,以您的格式並不完全一致 - 這是在PHP的格式,而不是怪異的Symfony一個... – watermanio

+0

不,仍然得到這個錯誤,調用一個成員函數的格式()在一個非對象DateTimeType.php線44 –

+0

上面的解決方案是錯誤的。正確的解決方案= '$從= \日期時間:: createFromFormat( 'YMD H:I:S',$交[ 'started_at']);' –

8

對於未來的讀者誰肯定總有一天會遇到這樣的問題的緣故(這是第一篇文章,如果你谷歌「從字符串的symfony 2日期時間」),請記住,在Symfony 2中,DateTime對象不接受具有以下格式的字符串:"d/m/Y H:i:s",並且可能不支持其他許多其他字符。

爲了不成爲那個瘋狂着想,其實我已經發現,爲了避免這樣的錯誤最簡單,最安全的辦法是這樣的一個:

首先,讓你的約會無論從任何樣的要求,你正在做的(在我的情況下,一個通用的AJAX請求),並將其轉換爲DateTime對象,這個例子假設我們需要創建25/04/2015 15:00一個DateTime對象,這是jQuery UI的意大利的DateTimePicker的格式(這只是一個例子):

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

(注:使用\使用PHP的DateTime對象,否則你將被使用的Symfony的日期時間對象,將你扔一個例外)

然後,一旦你做到了,創建一個使用舒適日期字符串格式功能,通過給第一個參數的輸出格式預期(Y-m-d H:i:s):

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

這樣,你是100%肯定要傳遞或接收,這將是適當的任何便利着想一種格式您只要提供您期望的輸入,您就不會從DateTime symfony對象中獲得任何類型的異常。

知道了這個帖子其實是很老,我剛剛決定後,因爲我沒有發現任何其他有價值的來源,而是要理解這個問題出在哪裏本來是。

請注意,最好的解決方案仍然是以正確的格式發送日期時間字符串,但如果您從字面上沒有辦法做到這一點,最安全的方式來轉換這樣的字符串是上面那個。

相關問題