首页 > 解决方案 > 正确的纪元到日期时间的转换

问题描述

使用这段代码:

$epoch=  '1609455600';
$date = new DateTime( '@'.$epoch);
echo $date-> format( 'Y-m-d');

我看到了这个结果2020-12-31。服务器时区报告为Europe/Zurich(带有date_default_timezone_get)。但在这个时区,该日期应该是 2021-1-1。

这里发生了什么?

标签: phpdatetime

解决方案


除了@tuckbros 的评论。var_export 的输出显示 DateTime 对象的时区为 00:00 (UTC)。

date_default_timezone_set('Europe/Zurich');
$epoch=  '1609455600';

$date = new DateTime( '@'.$epoch);

var_export($date);
/*
DateTime::__set_state(array(
   'date' => '2020-12-31 23:00:00.000000',
   'timezone_type' => 1,
   'timezone' => '+00:00',
)) 
*/

获取本地时间的干净方法是将对象传输到所需的时区(而不是添加任何偏移时间)。

$date->setTimeZone(new DateTimeZone(date_default_timezone_get()));
var_export($date);
/*
DateTime::__set_state(array(
   'date' => '2021-01-01 00:00:00.000000',
   'timezone_type' => 3,
   'timezone' => 'Europe/Zurich',
)) 
*/

您现在可以继续使用 DateTime 对象,因为它具有正确的时区以及正确的本地时间。


推荐阅读