You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带时区的日期字符串提取时间遇错,strtotime转换结果不符预期

问题剖析与解决办法

嘿,我来帮你搞明白为啥会出现这个情况哈!

问题根源在哪?

首先说你第一次的报错:date("H:i:s", "2018-04-13T15:36:00-05:00") 之所以报错,是因为date()的第二个参数必须是Unix时间戳(整数类型),你直接传了日期字符串,PHP没法把它当成合法的数值来处理,所以就弹出了"A non well formed numeric value encountered"错误。

再来说第二次的结果:你用strtotime()把带时区的日期转成了时间戳,这里要注意——Unix时间戳是基于UTC(协调世界时)的,它本身不带时区信息。你的原日期是UTC-5时区的15:36,转换成UTC时间就是15:36 + 5小时 = 20:36,而date()函数默认会用服务器的本地时区来解析这个时间戳,如果你的服务器时区是UTC或者和UTC一致,那输出自然就是20:36了,这和你想要保留原时区的15:36不符。

正确的解决姿势

想要精准保留原时区的时间,推荐用PHP的DateTime类,它对时区的处理要靠谱得多:

方法1:直接解析并输出原时区时间

$date = new DateTime("2018-04-13T15:36:00-05:00");
echo $date->format("H:i"); // 输出你想要的15:36

这个方法会直接把带时区的字符串解析成对应的DateTime对象,保留原时区信息,格式化输出的时候自然就是原时间了。

方法2:灵活转换时区(如果需要的话)

要是之后你需要把这个时间转换成其他时区,也很方便,比如转成UTC:

$date = new DateTime("2018-04-13T15:36:00-05:00");
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format("H:i"); // 输出20:36

小总结

  • 别再用strtotime()搭配date()处理带时区的日期啦,date()默认用服务器时区,很容易丢失原时区信息
  • DateTime类是PHP处理日期时间(尤其是带时区场景)的最优选择,能精准控制时区,避免踩坑

内容的提问来源于stack exchange,提问作者Pankaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:39:12