2012-09-20 98 views
2

Supplementry問題timestamp - php incrementing time stamp errorPHP - 時間戳 - 天之間的時間間隔不總是86400秒 - 爲什麼?

雖然接受這個類的DateTime可提供的分辨率我原來的查詢,仍然在時間戳的不明原因的變化。我真的很想理解這種差異,是否有其他這樣的時間戳「調整」以及它們是如何產生的。

請考慮以下幾點:

/* 
* test time stamp variances 
*/ 

$time_Stamp_1 = mktime(0,0,0,10,15,2012);echo "15/10/12: " . $time_Stamp_1; 
$time_Stamp_2 = mktime(0,0,0,10,16,2012);echo "<br/>16/10/12: " . $time_Stamp_2 . "increment= " . ($time_Stamp_2 - $time_Stamp_1); 
$time_Stamp_3 = mktime(0,0,0,10,17,2012);echo "<br/>17/10/12: " . $time_Stamp_3 . "increment= " . ($time_Stamp_3 - $time_Stamp_2); 
$time_Stamp_4 = mktime(0,0,0,10,18,2012);echo "<br/>18/10/12: " . $time_Stamp_4 . "increment= " . ($time_Stamp_4 - $time_Stamp_3); 
$time_Stamp_5 = mktime(0,0,0,10,19,2012);echo "<br/>19/10/12: " . $time_Stamp_5 . "increment= " . ($time_Stamp_5 - $time_Stamp_4); 
$time_Stamp_6 = mktime(0,0,0,10,20,2012);echo "<br/>20/10/12: " . $time_Stamp_6 . "increment= " . ($time_Stamp_6 - $time_Stamp_5); 
$time_Stamp_7 = mktime(0,0,0,10,21,2012);echo "<br/>21/10/12: " . $time_Stamp_7 . "increment= " . ($time_Stamp_7 - $time_Stamp_6); 
$time_Stamp_8 = mktime(0,0,0,10,22,2012);echo "<br/>22/10/12: " . $time_Stamp_8 . "increment= " . ($time_Stamp_8 - $time_Stamp_7); 
$time_Stamp_9 = mktime(0,0,0,10,23,2012);echo "<br/>23/10/12: " . $time_Stamp_9 . "increment= " . ($time_Stamp_9 - $time_Stamp_8); 
$time_Stamp_10 = mktime(0,0,0,10,24,2012);echo "<br/>24/10/12: " . $time_Stamp_10 . "increment= " . ($time_Stamp_10 - $time_Stamp_9); 
$time_Stamp_11 = mktime(0,0,0,10,25,2012);echo "<br/>25/10/12: " . $time_Stamp_11 . "increment= " . ($time_Stamp_11 - $time_Stamp_10); 
$time_Stamp_12 = mktime(0,0,0,10,26,2012);echo "<br/>26/10/12: " . $time_Stamp_12 . "increment= " . ($time_Stamp_12 - $time_Stamp_11); 
$time_Stamp_13 = mktime(0,0,0,10,27,2012);echo "<br/>27/10/12: " . $time_Stamp_13 . "increment= " . ($time_Stamp_13 - $time_Stamp_12); 
$time_Stamp_14 = mktime(0,0,0,10,28,2012);echo "<br/>28/10/12: " . $time_Stamp_14 . "increment= " . ($time_Stamp_14 - $time_Stamp_13); 
$time_Stamp_15 = mktime(0,0,0,10,29,2012);echo "<br/>29/10/12: " . $time_Stamp_15 . "increment= " . ($time_Stamp_15 - $time_Stamp_14); 

報告:

15/10/12: 1350255600 
16/10/12: 1350342000increment= 86400 
17/10/12: 1350428400increment= 86400 
18/10/12: 1350514800increment= 86400 
19/10/12: 1350601200increment= 86400 
20/10/12: 1350687600increment= 86400 
21/10/12: 1350774000increment= 86400 
22/10/12: 1350860400increment= 86400 
23/10/12: 1350946800increment= 86400 
24/10/12: 1351033200increment= 86400 
25/10/12: 1351119600increment= 86400 
26/10/12: 1351206000increment= 86400 
27/10/12: 1351292400increment= 86400 
28/10/12: 1351378800increment= 86400 
29/10/12: 1351468800increment= 90000 

因此:

> 15/10/2012 1350255600 + 604800 does increment 1 week to 22/10/2012 .. 
> 22/10/2012 1350860400 + 604800 does not increment 1 week to 29/10/2012 
> because although this results in 1351465200 which should be 29/10/2012 
> you can see from the above that it resolves to 28/10/2012 because for 
> some unexplained reason an extra hour 3600sec has been added to the 
> time stamp for 29/10/2012. 

我想知道,因爲從我的文檔閱讀mktime應該創建一個時間戳就像strtotime或DateTime一樣有效。

實際上使用的DateTime類方法getTimestamp

28/10/2012 = 1351378800 29/10/2012 = 1351468800所以再次一小時已添加的90000

增量暗示我是正確的在這個假設中。

很明顯,班級可以處理這個問題。但是沒有到哪裏,直到這一點有任何提及增加一個時間戳然而它產生的事實可能會導致一個問題......因此使用DateTime類或其他方法強制性以避免問題,如已遇到。

如果我必須轉換你使用類的代碼。但我想知道爲什麼這是必要的。

+3

您是否聽說過夏令營? –

+0

這就是爲什麼你要在實際日期而不是原始時間戳上進行數學計算。 – DCoder

+0

@MarkBaker OMG你的開玩笑爲什麼我沒有想到這一點!嗯,是的,我聽說過節省一天光照,作爲一名經驗豐富的導航員,我經常將這些時間差異應用於潮汐表。我不能相信我錯過了這一點。哎喲! – codepuppy

回答

6

由於夏時制的變化,2012年2月28日有extra hour in your timezone。從28/10年的午夜到29/10年的午夜有25個小時。

你還會發現春季23小時的一天。

如果這不符合您的期望,請將時區更改爲沒有DST的時區。 UTC是一種選擇:

php > echo mktime(0,0,0,10,29,2012) - mktime(0,0,0,10,28,2012); 
90000 
php > ini_set('date.timezone', 'UTC'); 
php > echo mktime(0,0,0,10,29,2012) - mktime(0,0,0,10,28,2012); 
86400 
+0

優秀的答案 - 我不必撤消已經編寫的代碼 - 我可以選擇全年使用UTC。我也知道我可以暫時改變ini文件。順便說一下,它的分頁工作現在都很好。 – codepuppy

1

我要去刺這個。 10月29日是夏令時的正好一週(除非你在夏令時不同的國家)。但是回落1小時會導致一天再增加1小時。