PHP将EEST转UTC时差1小时求助(维尔纽斯时区问题)
首先要明确一个关键事实:2020年4月18日,Europe/Vilnius时区确实处于夏令时(EEST),对应UTC+3——这个时区在当年3月29日02:00就切换到了夏令时,直到10月25日才转回冬令时(EET,UTC+2)。所以从标准时区规则来看,PHP给出的转换结果(13:50:05 EEST → 10:50:05 UTC)其实是符合规范的。
你觉得结果错误,大概率是以下几种原因,对应解决建议:
时区数据库版本过旧
PHP依赖系统的时区数据库(tzdata)处理时区规则,如果服务器上的tzdata版本太老,可能会出现时区规则识别偏差。你可以用以下代码检查当前PHP使用的时区数据库版本:echo timezone_version_get();如果版本低于2020a(2020年的第一个更新版本),建议更新系统的tzdata包(比如Linux系统用
apt install tzdata或yum update tzdata),或者安装/更新PHP的timezonedb扩展。对原始时间的时区归属判断有误
你提到的$raw_date(2020-04-18 13:48:22)是否真的是Europe/Vilnius的夏令时当地时间?如果这个时间实际上是按冬令时(UTC+2)记录的,那你需要确认原始数据的来源是否存在时区标注错误,必要时可以手动指定偏移量创建DateTime对象,或者调整时区参数。测试时的时间显示笔误
你提到创建DateTime对象后显示的时间是2020-04-18 13:50:05 EEST,但$raw_date是13:48:22,这里的2分钟偏差可能是测试时的输入错误?如果是代码逻辑导致的时间变化,需要检查是否有其他代码偷偷修改了这个DateTime对象。
最后再验证一次:按照标准时区规则计算,2020年4月18日Vilnius当地时间13:50:05转换为UTC确实是10:50:05;如果期望得到11:50:05的UTC时间,对应的当地时间应该是冬令时(比如10月26日之后)的13:50:05。
内容的提问来源于stack exchange,提问作者K.I

