需要在PHP中显示两个日期之间的天,小时,分钟和秒

时间:2014-03-23 21:10:21

标签: php countdown

我需要在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

我该怎么做?

3 个答案:

答案 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