Php 以小时为单位的十进制格式的两个日期时间之间的差异

Php 以小时为单位的十进制格式的两个日期时间之间的差异,php,time,Php,Time,我有2个日期时间,我需要以十进制格式计算它们之间的差异,以小时为单位。困难的部分是确保结果将值存储到小数点后2位 $datetime1 = new DateTime("2017-09-01 23:00:00"); $datetime2 = new DateTime(); $difference = $datetime2->diff($datetime1); 但结果只是一个整数,这对我来说失去了太多的准确性。如何将该值保留为小数点后2位?2位小数: $datetime1 = new Dat

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

$datetime1 = new DateTime("2017-09-01 23:00:00");
$datetime2 = new DateTime();
$difference = $datetime2->diff($datetime1);
但结果只是一个整数,这对我来说失去了太多的准确性。如何将该值保留为小数点后2位?

2位小数:

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

$epoch1 = $datetime1->getTimestamp();
$epoch2 = $datetime2->getTimestamp();

$diff = $epoch1 - $epoch2;

echo number_format( $diff / 3600, '2' );
小数点后2位:

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

$epoch1 = $datetime1->getTimestamp();
$epoch2 = $datetime2->getTimestamp();

$diff = $epoch1 - $epoch2;

echo number_format( $diff / 3600, '2' );

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

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

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

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

例如:

在PHP7.1中,您还可以通过添加
$diff->f/3.6e+9
来计算
微秒


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

例如:


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

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

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

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

例如:

在PHP7.1中,您还可以通过添加
$diff->f/3.6e+9
来计算
微秒


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

例如:


您使用的是哪个PHP版本?我假设
5.x
,但由于
DateTime
对象发生了更改,因此会对答案有所帮助。另外,任何关于您希望通过精度/最终结果实现什么的上下文也会很有帮助。您使用的是哪个PHP版本?我假设
5.x
,但由于
DateTime
对象发生了更改,因此会对答案有所帮助。此外,任何关于您希望通过精度/最终结果完成的内容的上下文也会有所帮助。无论哪种方法都有效,您还可以使用
DatePeriod
检索两个日期之间的秒数并执行相同的操作。无论采用哪种方法,都可以使用
DatePeriod
检索两个日期之间的秒数并执行相同的操作。作为提示,当前方程将导致负值。较晚的日期操作数应位于较早的日期操作数之前,以检索正值。像这样:
$diff=$epoch2-$epoch1作为提示,当前方程式将产生负值。较晚的日期操作数应位于较早的日期操作数之前,以检索正值。像这样:
$diff=$epoch2-$epoch1
$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