gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:39:41 24 4
gpt4 key购买 nike

我需要使用 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)

有什么建议吗?问候毛里齐奥

最佳答案

这不是错误。没有人能预测 future 。如果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>";

关于php - 在 64 位 unix PHP 上 2038 后转换为 UTC 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49977397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com