PHP、PostgreSQL与在线工具时间差计算结果不一致,求正确值
两个Datetime的时间差计算结果不一致,如何判断正确值?
需要计算起始时间2023-04-06 09:17:37与结束时间2022-11-17 11:24:30的时间差,使用三种方式得到不同结果,以下是各实现及结果:
各实现及结果
PHP代码实现
<?php $datetime1 = new DateTime('2023-04-06 09:17:37'); $datetime2 = new DateTime('2022-11-17 11:24:30'); $interval = $datetime1->diff($datetime2); $elapsed = $interval->format('%y years %m months %d days %h hours %i minutes %s seconds'); echo $elapsed;
输出结果:0 years 4 months 18 days 21 hours 53 minutes 7 seconds
PostgreSQL查询实现
SELECT age('2023-04-06 09:17:37', '2022-11-17 11:24:30')
输出结果:{"months":4,"days":18,"hours":21,"minutes":53,"seconds":7}
在线工具计算结果
输出结果:4 months, 19 days, 20 hours, 53 minutes, 7 seconds
正确结果判断
差异的核心原因是月份天数不固定,不同工具的时间差计算逻辑不同:
PHP/PostgreSQL的逻辑(符合日历规则):
优先计算完整的自然月数,剩余天数按实际日历日期计算,时间部分不够减时从日期借1天(24小时)。- 从
2022-11-17到2023-03-17是完整的4个月; - 从
2023-03-17到2023-04-06日历上是19天,但由于起始时间的时分秒(09:17:37)早于结束时间的时分秒(11:24:30),需从日期借1天,最终剩余天数为18天,时间部分变为21小时53分7秒(24+09:17:37 -11:24:30)。 - 这种逻辑严格遵循日历的月份划分,是符合实际日期流转的正确值。
- 从
在线工具的逻辑(存在偏差):
该结果的差异源于两种可能:一是按平均每月30天的规则转换总天数,忽略了不同月份的实际天数;二是时区设置不一致导致时间部分计算偏差。这种方式不符合真实的日历月份逻辑,结果存在误差。
如果需要符合实际日历的时间差,PHP和PostgreSQL的结果是正确的;若仅需近似的时长转换,在线工具的结果可作为参考,但不符合日期流转规则。
内容的提问来源于stack exchange,提问作者executable
相关产品推荐
相关产品推荐

