在64位unix PHP上2038之后转换为UTC时出错

时间:2018-04-23 09:17:30

标签: php datetime utc year2038 tzdata

我需要使用php(5.4)将日期时间信息从本地时间(gtm + 1)转换为UTC 在Centos 7.4 64位

我尝试了以下程序:

function convertToUtc ($date)
{
  $dateTime = new DateTime ($date, new DateTimeZone('Europe/Rome'));
  $dateTime->setTimezone(new DateTimeZone('UTC'));
  return $dateTime->format('Y-m-d') . 'T' . $dateTime->format('H:i:s') . 'Z';
}

这可以使用到2038年之后,它错误地计算了DST总是返回1小时的偏移量:

2037:一切都好

LOCAL TIME           ->  UTC TIME

2037-03-28 10:12:13  ->  2037-03-28T09:12:13Z   the day before dst change

2037-03-29 10:12:13  ->  2037-03-29T08:12:13Z   the first DST day

2037-10-24 10:12:13  ->  2037-10-24T08:12:13Z   the last DST day

2037-10-25 10:12:13  ->  2037-10-25T09:12:13Z   the day after


2038 : ok until dst change

2038-03-27 10:12:13  ->  2038-03-27T09:12:13Z   OK

2038-03-28 10:12:13  ->  2038-03-28T09:12:13Z   error : should be 2038-03-28 08:12:13Z

2038-10-30 10:12:13  ->  2038-10-30T09:12:13Z   error : should be 2038-10-30 08:12:13Z

2038-10-31 10:12:13  ->  2038-10-31T09:12:13Z   OK

请注意: 由于以下表达式正常工作,因此日期算术似乎不受unix时间戳限制(19/1/2018)的影响:

$date = new DateTime();
$date->modify('+100 year');
echo $date->format('Y-m-d');

(打印2118-04-23)

有什么建议吗? 关心maurizio

1 个答案:

答案 0 :(得分:0)

这不是错误。没有人能预测未来。 如果2021年欧盟废除夏季时间, 那么您从2022年到2037年的值是错误的。 PHP转换列表包含时区的所有偏移量更改。 我看到的最后一个条目是“ 2037-10-25T01:00:00 + 0000”。

<?php
$tzRome = new DateTimeZone('Europe/Rome');
$transitionsList = $tzRome->getTransitions();
echo "<pre>";
var_dump($transitionsList);
echo "</pre>";