在PHP中添加1天到时间戳

时间:2014-11-11 00:12:15

标签: php

我有一个网络应用程序,将所有日期存储为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;应该处理。帮助!

1 个答案:

答案 0 :(得分:1)

您的操作顺序错误。您将+1天添加到UTC时间,该时间没有DST差异。您应该首先转换为本地时区,然后再添加您的+1天,这样就可以了,因为计算将在正确的时区内,按预期自动进行检查。