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

PHP Unix时间戳转日期异常求助:1410938094654转换错误

解决Unix毫秒时间戳转DateTime的错误问题

嘿,我一眼就看出问题所在啦!你的时间戳1410938094654是13位的毫秒级时间戳,但PHP的DateTime构造器里的@语法只支持10位的秒级Unix时间戳。直接传入13位数值的话,PHP会把多出来的3位毫秒当成额外的秒数,自然就算出了错误的日期。

修正方案

只需要把毫秒时间戳除以1000,转换成秒级(可以保留小数来保留毫秒精度),再传入DateTime就可以了:

// 将毫秒时间戳转为秒级(保留毫秒精度)
$timestamp = 1410938094654 / 1000;
$dt = new DateTime("@$timestamp");
$dt->setTimeZone(new DateTimeZone('Asia/Tehran'));
// 输出包含毫秒的格式,或者按需调整format参数
echo $dt->format('F j, Y, g:i:s.u a');

如果不需要毫秒精度,也可以用floor()取整:

$timestamp = floor(1410938094654 / 1000);
$dt = new DateTime("@$timestamp");
$dt->setTimeZone(new DateTimeZone('Asia/Tehran'));
echo $dt->format('F j, Y, g:i a');

为什么gmdate也返回错误日期?

和DateTime一样,gmdate()函数同样只接受秒级的Unix时间戳作为参数。直接传入13位的毫秒时间戳,它会错误地将其解析为秒数,所以得到的结果自然不对。

验证正确结果

用修正后的代码,你会得到正确的GMT时间(转换前的UTC时间):Wednesday, September 17, 2014 7:14:54.654 AM,再转换为Asia/Tehran时区的话,会得到对应的当地时间(伊朗时区当时是UTC+3:30,所以当地时间是10:44:54 AM左右)。

另外你php.ini里的date.timezone = "Asia/Tehran"设置没问题,但它不影响@语法的解析——因为@指定的是UTC时间,之后的setTimeZone才会转换为目标时区,前提是时间戳本身是正确的秒级格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:01