PHP中将毫秒级时间戳转换为格式化日期字符串结果异常
解决PHP纪元时间戳转格式化日期的错误问题
这个问题我太熟悉了——你踩了一个非常常见的时间戳单位坑!
问题根源
你使用的1104555600000是毫秒级纪元时间戳,但PHP的date()函数默认只接受秒级时间戳作为参数。直接把毫秒数传进去,相当于把时间放大了1000倍,自然会算出一个早得离谱的日期(1993年那个结果就是这么来的)。
两种解决方案
方案1:手动转换为秒级时间戳
最简单的方式就是把毫秒数除以1000,并且确保结果是整数(避免浮点精度问题):
$dateStart = 1104555600000; // 转换为秒级时间戳,用intval确保是整数 $timestampInSeconds = intval($dateStart / 1000); $formattedDate = date('Y-m-d', $timestampInSeconds); echo $formattedDate; // 输出:2005-01-01
方案2:使用DateTime类(更推荐)
面向对象的方式更灵活,也能避免很多时间处理的坑,直接支持毫秒时间戳的转换:
$dateStart = 1104555600000; // 用@符号加秒级时间戳初始化DateTime $date = new DateTime('@' . intval($dateStart / 1000)); $formattedDate = $date->format('Y-m-d'); echo $formattedDate; // 输出:2005-01-01
如果需要精确处理毫秒(比如后续要保留毫秒信息),可以用更严谨的写法:
$dateStart = 1104555600000; $date = DateTime::createFromFormat('U.u', sprintf('%.3f', $dateStart / 1000)); $formattedDate = $date->format('Y-m-d'); echo $formattedDate; // 输出:2005-01-01
小提醒
以后处理时间戳的时候一定要注意单位:PHP原生的时间函数(date()、time()等)都是基于秒级的,而很多前端框架、数据库或者第三方API返回的是毫秒级时间戳,转换的时候别忘除以1000哦!
内容的提问来源于stack exchange,提问作者Blake Rivell
相关产品推荐
相关产品推荐

