PHP使用epoch时间戳初始化DateTime时区偏差问题求解
问题原因分析
你遇到的日期偏差是PHP的DateTime类处理@前缀时间戳的固有特性导致的,具体如下:
- 当你使用
@+ 时间戳的方式传入DateTime构造函数时,PHP会强制忽略date_default_timezone_get()返回的服务器默认时区,始终以UTC时区解析该时间戳。 - 你使用的时间戳
1609455600对应的UTC时间为2020-12-31 23:00:00,而苏黎世时区为UTC+1(冬令时),对应本地时间才是2021-01-01 00:00:00。因为构造时强制用了UTC时区,格式化输出自然得到2020-12-31。
修复方案
- 方案1:构造完成后手动设置目标时区
$epoch = '1609455600'; $date = new DateTime('@' . $epoch); // 手动设置为服务器默认时区,也可传入指定时区字符串 $date->setTimezone(new DateTimeZone(date_default_timezone_get())); echo $date->format('Y-m-d'); // 输出 2021-01-01
- 方案2:使用
createFromFormat方法指定时区创建对象
$epoch = '1609455600'; $date = DateTime::createFromFormat('U', $epoch, new DateTimeZone('Europe/Zurich')); echo $date->format('Y-m-d'); // 输出 2021-01-01
内容的提问来源于stack exchange,提问作者theking2
相关产品推荐
相关产品推荐

