十进制格式的 2 个日期时间(以小时为单位)之间的差异

Jef*_*ers 1 php time

我有 2 个日期时间,我需要以十进制格式计算它们之间的小时数差异。困难的部分是确保结果将值存储到小数点后两位。

$datetime1 = new DateTime("2017-09-01 23:00:00");
$datetime2 = new DateTime();
$difference = $datetime2->diff($datetime1);
Run Code Online (Sandbox Code Playgroud)

但结果只是一个整数,这对我来说失去了太多的准确性。如何将数值保留到小数点后两位?

fyr*_*rye 5

DateTime::diff返回DaterInterval每个与时间相关的属性的整数。

该days属性不考虑少于一天的增量,因为它们会累积到较小的属性并从中删除,然后向下舍入。

所以$diff->h永远不会大于23。而 且$diff->s永远$diff->i不会大于59。year其中 days 将包含和属性中的总天数month。不要与 混淆$diff->d,它是增量天数。

为了使用 diff 确定总小时数,您只需对每个属性执行数学运算即可检索该属性的小时数。

示例: https: //3v4l.org/KhBQC

$datetime1 = new DateTime('2017-09-01 23:00:00');
$datetime2 = new DateTime('2017-09-02 01:34:00');
$diff = $datetime2->diff($datetime1);
$hours = round($diff->s / 3600 + $diff->i / 60 + $diff->h + $diff->days * 24, 2);
echo $hours; //2.57
Run Code Online (Sandbox Code Playgroud)

在 php 7.1 中,您还可以microseconds通过添加$diff->f / 3.6e+9.


更简单的方法是减去 unix 时间戳,以检索两个日期之间的总秒数。然后将剩余秒数除以一小时的秒数 (3600)。

示例: https: //3v4l.org/SbjEU

$datetime1 = new DateTime('2017-09-01 23:00:00');
$datetime2 = new DateTime('2017-09-02 01:34:00');

$hours = round(($datetime2->getTimestamp() - $datetime1->getTimestamp()) / 3600, 2);

echo $hours; //2.57
Run Code Online (Sandbox Code Playgroud)