2016-04-21 73 views
0

我有此PHP代碼:getTimestamp沒有給正確的小時

$from_date = new DateTime('April-22-2016'); 
$from_date->format('Y-m-d 00:00:00'); 
$from_date->setTime(0,0,0); 
print '/'. $from_date_unix = $from_date->getTimestamp(); 

上述代碼打印的1461356160 Unix時間戳,這意味着 GMT:Fri, 22 Apr 2016 20:16:00 GMT

營業時間是20:16:00 - 這是奇怪,因爲我已經設置時間00:00:00通過

$from_date->setTime(0,0,0); 

是我的代碼錯了嗎?我需要檢查php.ini中的某些內容嗎?

回答

3

你作爲第一個參數DateTime::__construct()的日期不使用任何理解標準date and time formats的由PHP。因此,它會嘗試識別您提供的字符串中的日期和時間組件。在創建後立即

一個print_r($from_date)揭示了什麼PHP(誤)從您的日期理解爲:

DateTime Object 
(
    [date] => 2016-04-22 00:00:00.000000 
    [timezone_type] => 1 
    [timezone] => -20:16 
) 

別的之前,它開始解析日期&時間的字符串時,PHP初始化新DateTime與當前日期,時間和時區對象。然後,它會覆蓋如下字符串中的它標識的組件:

  • April被正確識別爲月份名稱;
  • 22是月份的一天;
  • 由於某種原因,我現在不知道,它將新對象的時間設置爲00:00:00;
  • 其餘的字符串(-2016)被用作時區偏移量;即-20:16小時。

也許它的工作方式聽起來很愚蠢,但由於您提供了一個隨機字符串,這是最好的它可以擺脫它。

代碼的下一行($from_date->format('Y-m-d 00:00:00');)會生成一個字符串,並且不會修改DateTime對象。由於您對DateTime::format()返回的字符串沒有做任何操作,因此整行是no-op

下一行($from_date->setTime(0,0,0);)對$from_date也沒有任何影響,因爲時間已經是00:00:00

現在很清楚爲什麼$from_date->getTimestamp()返回時間20:16 GMT:當它在時區的00:00與偏移-20:16,在GMT時區已經有20:16


爲了得到你想要的,你需要使用DateTime::createFromFormat()靜態函數:在格式說明符的開始

$from_date = DateTime::createFromFormat(
    '!F-d-Y', 
    'April-22-2016', 
    new DateTimeZone('GMT') 
); 
print '/'. $from_date_unix = $from_date->getTimestamp(); 

備註感嘆號(!)。它告訴PHP將所有日期和時間組件重置到Unix Epoch。這樣生成的日期已經有了時間00:00:00,並且不需要設置它。

它的輸出是:

1461283200 
+0

真的很好的答案 - 它應該是公認的,不是我的。我只是直接指出了問題,而不是解釋一切。 – rinukkusu

+0

的確,感謝您花時間寫出這樣一個好的答案。 – Crerem

-1

您可以用DateTime::createFromFormat

正確的格式解析DateTime對象使用方法如下:

$from_date = DateTime::createFromFormat('!F-d-Y', 'April-22-2016'); 
$from_date->format('Y-m-d 00:00:00'); 
print '/'. $from_date_unix = $from_date->getTimestamp(); 
+1

那不是'M'必須'F'? –

+0

是的,你是對的! – rinukkusu

+0

謝謝 - 它適用於createFromFormat – Crerem