php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案
為什么它說5,為什么這在技術上是正確的
在Sydney,DST開始于2013-10-06 02:00:00 – 所以你跨越那個日期會失去一個小時.
當你調(diào)用strtime時,它會將時間解釋為悉尼時間,但返回一個Unix時間戳.如果您將第二組時間戳轉(zhuǎn)換為UTC,則會得到2013-09-30 14:00:00到2013-10-06 13:00:00的范圍,這不是6天,所以得到向下舍入到5.
如何獲得忽略DST轉(zhuǎn)換的時差
請嘗試使用DateTime對象,例如
$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-01', $tz);
$end=new DateTime('2013-10-07', $tz);
$diff=$end->diff($start);
//displays 6
echo "difference in days is ".$diff->d."\n";
為什么DateTime :: diff的工作方式不同?
你可能會問“為什么會這樣?” – 畢竟,在這些時間之間確實沒有6天,它是5天23小時.
原因是DateTime::diff實際上糾正了DST轉(zhuǎn)換.我不得不閱讀源代碼來解決這個問題 – 修正發(fā)生在內(nèi)部timelib_diff函數(shù)中.如果滿足以下所有條件,則會發(fā)生此更正
>每個DateTime使用相同的時區(qū)
>時區(qū)必須是地理ID,而不是GMT這樣的縮寫
>每個DateTime必須具有不同的DST偏移(即一個在DST中,一個不在DST中)
為了說明這一點,如果我們在切換到夏令時的任何一側(cè)使用兩次幾個小時就會發(fā)生這種情況
$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-06 00:00:00', $tz);
$end=new DateTime('2013-10-06 04:00:00', $tz);
//diff will correct for the DST transition
$diffApparent=$end->diff($start);
//but timestamps represent the reality
$diffActual=($end->getTimestamp() - $start->getTimestamp()) / 3600;
echo "Apparent difference is {$diffApparent->h} hours\n";
echo "Actual difference is {$diffActual} hours\n";
這輸出
Apparent difference is 4 hours
Actual difference is 3 hours
總結(jié)
以上是生活随笔為你收集整理的php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51单片机参考网址
- 下一篇: ie兼容响应式布局的实现总结