2014-09-05 100 views
1

我在比較PHP中的DateTime對象。將datetime與不同的timezone_type進行比較php

$Time1 = DateTime::createFromFormat('UP', '1409900072+0200'); 

$Time2 = new DateTime('2014-09-05 07:54:32'); 

的時間2使用defoult這是歐洲/哥本哈根,比較收益率以下

if ($Time2 > $Time1){ 
    echo "true \n"; 
} else { 
    echo "false \n"; 
} 

true 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(19) "2014-09-05 06:54:32" 
    ["timezone_type"]=> 
    int(1) 
    ["timezone"]=> 
    string(6) "+02:00" 
} 
object(DateTime)#2 (3) { 
    ["date"]=> 
    string(19) "2014-09-05 07:54:32" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(17) "Europe/Copenhagen" 
} 

我的理解是實際的本地時間時間1是8時54分32秒的方式,因此如何我可以在同一時區獲得比較嗎?

在此先感謝

+0

問題是,無論如何,'1409900072'用'+ 0200'做什麼? UNIX時間戳不需要隨附的時區;那麼它的意義究竟是什麼?另外,'+ 0200'對於大多數用途來說是相當無用的信息;需要通過名稱指定時區纔是真正有用的。 – deceze 2014-09-05 10:25:41

+1

@deceze - 同意,但是這些可以在某些地方找到,比如從較舊的ASP.Net JSON實現中序列化的數據,其值類似'「/ Date(1198908717056-0700)/」'。在特定情況下,該值以毫秒爲單位,偏移量是額外的數據。 ms值不反映偏移量。將其與ISO8601進行比較,其中偏移表示該值已經*已經被偏移調整。難怪PHP在這裏感到困惑。 @Mads - 關於這種輸入格式來自哪裏的一些細節將會很有用。謝謝。 – 2014-09-05 16:34:06

+0

@MattJohnson - 完整的時間戳記如您所示/ Date(1409900072 + 0200)/並且它是來自Dandomain.dk網店系統的輸出。時間是在購物系統中創建訂單的時間。 – 2014-09-06 13:27:11

回答

1

真奇怪的部分是你的初始值1409900072+0200。如果1409900072是UNIX時間戳,傳遞一個特定的時區是沒有意義的。它似乎導致PHP不正確地創建實例;它創建時間設置爲UTC值(6:54)的實例,但時區偏移量爲+0200(實際上時間應爲8:54)。

可以說這應該作爲一個錯誤報告提交;但可以說,輸入數據開始時是無意義的。

如果你在一個UNIX時間戳餵養,則忽略它可能包含任何時區信息與時區明確設置爲UTC,那麼這一切按預期工作:

$t1 = DateTime::createFromFormat('U+', '1409900072+0200', new DateTimeZone('UTC')); 
$t2 = new DateTime('2014-09-05 07:54:32', new DateTimeZone('Europe/Copenhagen')); 

var_dump($t1 > $t2); // true 

注意,PHP before 5.3.9似乎與createFromFormat呼叫有問題;如果您需要支持這些版本,您可能需要手動過濾掉時區。

+1

感謝您的意見,我現在明白這個問題。我決定現在只使用UNIX時間戳部分,因爲包括+0200在我的代碼的其他地方會導致一些挑戰。 – 2014-09-06 13:35:00

0

都轉換DateTime是否爲UTC(setTimeZone('UTC')),然後對它們進行比較。

<?php 
$Time1 = DateTime::createFromFormat('UP', '1409900072+0200'); 
$Time2 = new DateTime('2014-09-05 07:54:32'); 

// convert 
$utc = new DateTimeZone('UTC'); 

$time1_utc = clone $Time1; 
$time1_utc->setTimeZone($utc); 

$time2_utc = clone $Time2; 
$time2_utc->setTimeZone($utc); 

var_dump($Time1,$Time2); 
var_dump($time1_utc,$time2_utc); 
+0

如果您在兩者上都這樣做,它會將Time1轉換爲'2014-09-05 04:54:32',這是錯誤的。 – deceze 2014-09-05 10:23:59

+0

爲什麼它錯了?它被指定爲+ 2h從UTC – PauloASilva 2014-09-05 10:34:03

+0

UNIX時間戳1409900072表示2014-09-05 06:54:32 UTC時間。 – deceze 2014-09-05 10:40:05