PHP计算日期差时Unix Timestamp异常问题咨询
为什么PHP计算日期差时会出现Unix Timestamp异常?
这个问题的核心原因是夏令时切换导致本地时区的一天并非严格24小时,而Unix时间戳是基于UTC的绝对时间,两者结合就会出现差值异常。我来给你拆解清楚:
1. 问题根源:夏令时与时区的影响
Unix时间戳(timestamp)是从1970年1月1日00:00:00 UTC开始计算的秒数,它是绝对时间,完全不受时区、夏令时的影响。但你创建DateTime对象时,默认使用的是服务器的本地时区(可以通过date_default_timezone_get()查看当前时区)。
在夏令时切换的时段,本地时区的一天会“丢失”或“多出”1小时:
- 比如2020年3月8日,很多国家(如美国)会从冬令时切换到夏令时,时钟往前拨1小时,这一天的本地时间实际只有23小时。
- 当你用
getTimestamp()获取这两个日期的UTC时间戳时,差值就是23*3600=82800秒,除以86400(24小时的秒数)自然得到0.958333...。
2. 正确的日期差计算方式
别再依赖时间戳相减来计算日历天数了,PHP的DateTime::diff()方法是专门为日期差设计的——它基于日历逻辑计算,会自动处理夏令时、闰年等所有特殊情况:
$date = new DateTime('2020-03-08'); $date2 = new DateTime('2020-03-09'); $diff = $date2->diff($date); echo $diff->days; // 输出:1
3. 如果一定要用时间戳怎么办?
那你得确保所有DateTime对象都基于UTC时区创建——UTC没有夏令时,每一天都是严格的24小时:
$date = new DateTime('2020-03-08', new DateTimeZone('UTC')); $date2 = new DateTime('2020-03-09', new DateTimeZone('UTC')); $diff = $date2->getTimestamp() - $date->getTimestamp(); var_dump($diff/(60*60*24)); // 输出:float(1)
内容的提问来源于stack exchange,提问作者Igor Novikov
相关产品推荐
相关产品推荐

