Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP日期时间戳不正确_Php_Date_Timezone - Fatal编程技术网

PHP日期时间戳不正确

PHP日期时间戳不正确,php,date,timezone,Php,Date,Timezone,我有一个时间戳,我正试图转换到另一个时区。这样做时,我需要考虑DST 我使用的代码如下: $date = new DateTime("@".$timestamp); echo $date->format('Y-m-d H:i:s')."\r\n"; $date->setTimezone(new DateTimeZone('Europe/Paris')); echo $date->format('Y-m-d H:i:s')."\r\n"

我有一个时间戳,我正试图转换到另一个时区。这样做时,我需要考虑DST

我使用的代码如下:

    $date = new DateTime("@".$timestamp); 

    echo $date->format('Y-m-d H:i:s')."\r\n";

    $date->setTimezone(new DateTimeZone('Europe/Paris'));   
    echo $date->format('Y-m-d H:i:s')."\r\n";  // Pacific time

    $date->setTimezone(new DateTimeZone('Europe/Athens'));
    echo $date->format('Y-m-d H:i:s')."\r\n";  // Berlin time  
输出(正确)为:

但是,如果我将格式更改为“U”,这是Date()中用于获取时间戳的值,则会输出以下内容:

1391113488
1391113488
1391113488

为什么时间戳不带应用于它们的时区偏移量?

DateTime::getOffset
将以秒为单位提供偏移量,
DateTime::getTimestamp
将提供始终为UTC的Unix时间戳(提供与
$DateTime->format('U')
相同的格式)

因此,为了获得带有偏移量的“时间戳”,请执行以下操作:

$timestampWithOffset = $date->getTimestamp() + $date->getOffset();

DateTime::getOffset
将以秒为单位提供偏移量,
DateTime::getTimestamp
将提供始终为UTC的Unix时间戳(与
$DateTime->format('U')
相同)

因此,为了获得带有偏移量的“时间戳”,请执行以下操作:

$timestampWithOffset = $date->getTimestamp() + $date->getOffset();

Unix时间戳始终是UTC格式,因为它们显示为Unix时间戳(这是
U
格式给出的),没有时区,但是UTC Unix时间戳的定义:自1970年1月1日午夜起的秒。时区是如何定义的?Unix时间戳总是以UTC表示的,因为它们显示为Unix时间戳(这是
U
格式给出的),没有时区,但却是UTC Unix时间戳的定义:自1970年1月1日午夜起的秒数。时区是如何定义的——虽然它不再是UNIX时间戳了,因此也没什么用处。不,它不一定没什么用处。这取决于您的使用情况。@sjkm:您能提供一个有用的例子吗?这是我将要采用的一个选项,但偏移量是否考虑DTC?除非您也知道偏移量是多少,并且在将“时间戳”反向计算为人类可读的时间时将其包括在计算中,时间戳不正确。你真的应该按原样保存时间戳,并另外存储你希望它显示的特定时区,这是你无论如何都需要做的事情。虽然这不再是UNIX时间戳,因此它相当无用。不,它不一定无用。这取决于您的使用情况。@sjkm:您能提供一个有用的例子吗?这是我将要采用的一个选项,但偏移量是否考虑DTC?除非您也知道偏移量是多少,并且在将“时间戳”反向计算为人类可读的时间时将其包括在计算中,时间戳不正确。您应该将时间戳保存为原样,并另外存储您希望它显示的特定时区,这是您无论如何都需要做的事情。