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

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


正确结果判断

差异的核心原因是月份天数不固定,不同工具的时间差计算逻辑不同:

  1. 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)。
    • 这种逻辑严格遵循日历的月份划分,是符合实际日期流转的正确值。
  2. 在线工具的逻辑(存在偏差):
    该结果的差异源于两种可能:一是按平均每月30天的规则转换总天数,忽略了不同月份的实际天数;二是时区设置不一致导致时间部分计算偏差。这种方式不符合真实的日历月份逻辑,结果存在误差。

如果需要符合实际日历的时间差,PHP和PostgreSQL的结果是正确的;若仅需近似的时长转换,在线工具的结果可作为参考,但不符合日期流转规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:50:56