2013-07-26 110 views
1

我在使用PHP的timezone_transitions_get()時發現了一些奇怪的事情。返回的數組的第一個元素似乎是這樣的不大可能/ unuseable值,而不管時區的使用:從PHP的timezone_transitions_get()返回這個奇怪的值是什麼?

php -r 'print_r(timezone_transitions_get(new DateTimeZone("GMT")));' 
Array 
(
    [0] => Array 
     (
      [ts] => -9223372036854775808 
      [time] => -292277022657-01-27T08:29:52+0000 
      [offset] => 0 
      [isdst] => 
      [abbr] => UTC 
     ) 

) 

php -r 'print_r(timezone_transitions_get(new DateTimeZone("US/Pacific")));' 
Array 
(
    [0] => Array 
     (
      [ts] => -9223372036854775808 
      [time] => -292277022657-01-27T08:29:52+0000 
      [offset] => -25200 
      [isdst] => 1 
      [abbr] => PDT 
     ) 
... 

我用PHP 5.3和5.4嘗試這樣做。它似乎與使用的PECL timezonedb版本無關。任何人都知道這是爲什麼發生?

回答

0

查看this documentation以供參考timezone_transitions_get。很顯然,他們缺少以下細節:

[ts]值表示的過渡時間戳記,因爲午夜1970年1月1日UTC的微秒數量。它存儲爲一個64位有符號整數,其中-9223372036854775808是可能的最小值。

[time]值是值爲[ts]值的ISO8601字符串。對負數年份來說這看起來很有趣,尤其是那些有很多數字的數字,但這的確是數學上的等值。

把這些想象成「時間的開始」。那麼,至少就計算機而言。 :-)

[offset]值是轉換的UTC偏移量表示的整秒數。除以3600,您將獲得相同的小時數。

[isdst]值是布爾型(1或空白),指示偏移是否代表夏令時。

[abbr] value是描述時區的簡短縮寫。 Abbreviations can be ambiguous,所以它只是作爲一個顯示值和便於參考。沒有東西應該被關掉。

+0

感謝您的回答。顯然這自PHP 5.2以來已經發生了變化,因爲我正在更新一些代碼,並沒有期待這個額外的默認轉換。另外值得注意的是,strtotime()無法處理該[時間]值。 –

+0

在32位和64位系統上可能會有所不同。也許在32位系統上仍然是以毫秒爲單位。不太確定PHP是否有這種怪癖。 –

+0

在這種情況下(64位)相同的系統,我所做的只是更新PHP。 –