我需要在PHP中显示两个日期之间的天,小时,分钟和秒的差异。我已经尝试过这里提出的建议:
Create Day, Hour, Minute and Second countdown in PHP
他们都给出了不正确的结果。这是一个例子:
$startdate = "2014-03-20 12:34:56";
$enddate = "2014-04-01 13:34:56";
$diff = strtotime($enddate) - strtotime($startdate);
$temp = $diff/86400; // (60 sec/min * 60 min/hr * 24 hr/day = 86400 sec/day)
$dd = floor($temp); $temp = 24*($temp-$dd); //Days
$hh = floor($temp); $temp = 60*($temp-$hh); //Hours
$mm = floor($temp); $temp = 60*($temp-$mm); //Minutes
$ss = floor($temp); //Seconds
echo $dd." days\n".
$hh." hours\n".
$mm." minutes\n".
$ss." seconds";
我指定的两个时间戳的结果应:
11 days
1 hour
0 minutes
0 seconds
但是当我运行它时,它正在给我:
12 days
0 hours
0 minutes
0 seconds
我该怎么做?
答案 0 :(得分:3)
您获得的输出是正确的。您所在时区的DST会在3月底前发生变化。如果您认为输出不正确(您可以这样做),您可以这样做:
$diff = strtotime($enddate." UTC") - strtotime($startdate." UTC");
然后计算其余部分(但是:请参阅下面的编辑)。
UTC
是"协调世界时",因此以上是"日光节省"差。
如果您未明确向UTC
提供时区(如strtotime()
),则会使用默认时区,即date_default_timezone_get()
的输出。
修改强>
事实证明,我的机器上的算法,通过上述修改和您的日期时间,打印出以下内容:
12 days
0 hours
59 minutes
59 seconds
怎么来的?原因是你不应该依赖浮点算术的精确性,特别是除法,除非在极少数情况下。您的除法结果为12.041666666667
,之后的几行会导致您的小时数为0.99999999999999
而不是1.0
。
我建议不要修复算法,而是遵循@salathe的建议,并且为了得到你期望的结果(这可能不是某人/别人期望的结果):
$diff = date_create($startdate)->diff(date_create($enddate));
echo $diff->format("%a days\n%h hours\n%i minutes\n%s seconds\n");
否则,对两种解释都有效的算法修正是:
if ($ignore_dst) {
$diff = strtotime($enddate." UTC") - strtotime($startdate." UTC");
} else {
$diff = strtotime($enddate) - strtotime($startdate);
}
$ddss = $diff % 86400;
$dd = ($diff - $ddss) / 86400;
$hhss = $ddss % 3600;
$hh = ($ddss - $hhss) / 3600;
$mmss = $hhss % 60;
$mm = ($hhss - $mmss) / 60;
$ss = $mmss % 60;
这里所有的变量都是整数(你可以用var_dump()
来检查),但即使它们不是,只有当你已经有一个除数的倍数时才进行除法,这可以保证结果。
答案 1 :(得分:2)
夏令时在
之间变化答案 2 :(得分:0)
为什么你不使用 date()函数?
date("d", $timestamp); // day