2013-03-16 57 views
1

我想計算兩個時間戳之間的差異,然後將其轉換回成可讀人日計算,但我越來越加收2小時內添加到我的約會!我不知道爲什麼。PHP日期不正確的方式

$data = $row['date_future']; // 1363473942 
$time = time(); // 1363472242 

//echoing future date 
echo "Future time: ".date('H:i:s', $data)."<br/>"; 
echo "Current time:".date('H:i:s', $time)."<br/>"; 

OUTPUT:

未來時間:0時45分42秒

當前時間:0點17分22秒

沒事的,但是當我米試圖計算差額我得到額外的2小時!

echo "Difference: ".date('H:i:s', $data-$time); 

OUTPUT:

差異:二時28分20秒

FIX:

$d1 = new DateTime(date('H:i:s', $data)); 
$d2 = new DateTime(date('H:i:s', $time)); 
$interval = date_diff($d2, $d1); 

echo "Difference: ".($interval->format('%H:%i:%s')) 

OUTPUT:

差異:0點28分20秒

+0

試試'echo「差異:」.date('H:i:s',$ data- $ time + 86400);'和後期結果 - 如果我的理論是正確的,這是一個測試。 – 2013-03-16 22:23:30

+1

我收到了正確的結果:http://codepad.org/TNwDTxCw。我猜你正在遇到一個時區問題。嘗試使用['DateTime :: diff'](http://php.net/manual/en/datetime.diff.php)方法。 – Tchoupi 2013-03-16 22:25:16

+0

這看起來像夏令時問題。你在什麼時區? – johannes 2013-03-16 22:27:20

回答

3

這不是一個真正的時區問題(至少不是設置 PHP配置中的正確時區參數) - 這是一個有缺陷的邏輯問題。

Unix的時間戳以秒爲單位,從1.1.1970 00:00:00 UTC。

1363473942 - 1363472242是1700 - 當你看到不僅在H:我:該日期部分S,它應該成爲顯而易見的:

echo "Difference: ".date('r', $data-$time); // replaced format H:i:s with r 

此輸出

差異:星期四,1970年一點28分20秒+0100

01一月 - 所以我們現在看到的是完全不同的日期這裏,和Wi第一時間看起來似乎不合邏輯的不同時間點的時區偏移和DST開啓/關閉實際上是預期的。

從另一個減去另一個unix時間戳會導致秒數 - 但它不是一個unix時間戳,它將不再與原始時間戳有關係任何

格式化這種差異,假設它是一個有意義的unix時間戳,因此必然會失敗。

使用例如DateTime::diff將是一個明智的方法來處理此問題。

3

時間戳是UNIX時間戳和它們所代表的時間量(以秒計),因爲午夜UTC通過,1 1970年1月

之間的差兩個時間戳是1700秒,所以它表示1970年1月1日午夜1970年1月1日凌晨0:28 UTC之後1700秒的日期。您必須提前2小時才能顯示爲1月1日2:28。