我有一个网络应用程序,将所有日期存储为UTC时间戳。使用时区设置更改日期以用于客户端的显示目的。但是,我在上周日(2014年11月2日)遇到了一个边缘案例,这是DST在美国结束的时候。我认为我的代码处理了这个案例,因为它使用strtotime和" +1 Day"但它并没有。这是我所拥有的代码:
$current_date_start=$this->date_start; //$this->date_start is a UTC timestamp
$current_date_end=strtotime('+1 day', $current_date_start);
do
{
$current_date_start=strtotime('+1 day', $current_date_start);
$current_date_end=strtotime('+1 day', $current_date_start);
echo format_local_date($current_date_start,'America/Los_Angeles',"D F j Y H i s")."<br />";
}
while ($current_date_start<$this->date_end);
function format_local_date($timestamp,$timezone,$format_str='')
{
$date_time=new DateTime_52("now",new DateTimeZone($timezone));
$date_time->setTimestamp($timestamp);
if ($format_str=='')
$format_str="F j Y";
return $date_time->format($format_str);
}
//
//DateTime_52 class
//
/**
* Provides backwards support for php 5.2's lack of setTimestamp and getTimestamp
*/
class DateTime_52 extends DateTime{
/**
* Set the time of the datetime object by a unix timestamp
* @param int $unixtimestamp
* @return DateTime_52
*/
public function setTimestamp($unixtimestamp){
if(!is_numeric($unixtimestamp) && !is_null($unixtimestamp)){
trigger_error('DateTime::setTimestamp() expects parameter 1 to be long, '.gettype($unixtimestamp).' given', E_USER_WARNING);
} else {
$default_timezone=date_default_timezone_get();
$this_timezone= $this->getTimezone();
date_default_timezone_set($this->getTimezone()->getName());
$this->setDate(date('Y', $unixtimestamp), date('n', $unixtimestamp), date('d', $unixtimestamp));
$this->setTime(date('G', $unixtimestamp), date('i', $unixtimestamp), date('s', $unixtimestamp));
date_default_timezone_set($default_timezone);
}
return $this;
}
/**
* Get the time of the datetime object as a unix timestamp
* @return int a unix timestamp representing the time in the datetime object
*/
public function getTimestamp(){
return $this->format('U');
}
}
这是输出:
Sun November 2 2014 00 00 00
Sun November 2 2014 23 00 00
Mon November 3 2014 23 00 00
Tue November 4 2014 23 00 00
Wed November 5 2014 23 00 00
Thu November 6 2014 23 00 00
Fri November 7 2014 23 00 00
Sat November 8 2014 23 00 00
你可以看到它下降了一个小时。显然是DST边缘情况。但我认为&#34; +1 Day&#34;应该处理。帮助!
答案 0 :(得分:1)
您的操作顺序错误。您将+1天添加到UTC时间,该时间没有DST差异。您应该首先转换为本地时区,然后再添加您的+1天,这样就可以了,因为计算将在正确的时区内,按预期自动进行检查。