【问题标题】:Need to show days, hours, minutes and seconds between two dates in PHP需要在 PHP 中显示两个日期之间的天、小时、分钟和秒
【发布时间】:2014-03-23 21:10:20
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 使用 PHP 的 DateTime 类 php.net/manual/en/datetime.diff.php
  • 也许是夏令时?
  • 3 月有 31 天,所以您的预期可能是 12 天、1 小时 0 分 0 秒,而不是 11 天等。
  • date_create($startdate)->diff(date_create($enddate))->format('%a days %h hours %i minutes %s seconds') 将是一种更现代的方法,并且会给出正确的结果,而不是自己做算术。
  • @salathe,在这种情况下,正确的结果取决于谁或什么使用它(见我的回答)。

标签: php countdown


【解决方案1】:

你得到的输出是正确的。您所在时区中的DST 在三月底附近发生变化。如果你认为输出不正确(你可以这样做),你可以这样做:

$diff = strtotime($enddate." UTC") - strtotime($startdate." UTC");

然后是其余的计算(但是:请参阅下面的编辑)。

UTC 是“协调世界时”,因此上述是“无夏令时”的差异。

如果您没有明确向strtotime() 提供时区(如UTC),它将使用默认时区,即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()检查),但即使不是,只有当你已经有除数的倍数时才会进行除法,这保证了结果。

【讨论】:

    【解决方案2】:

    夏令时更改

    【讨论】:

      【解决方案3】:

      为什么不使用 date() 函数?

       date("d", $timestamp); // day
      

      【讨论】:

      • 你到底是什么意思?
      • 提问者将打印出日/月/年/或其他。为什么他不使用正确的 PHP 函数?
      • OP想要输出日期时间之间的差异 - 他应该如何使用date()
      • 嗯是的,但是请阅读:为什么他不使用正确的 PHP函数?
      • 对不起,我真的不明白 - ich gebe es auf
      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2012-12-03
      • 2020-11-25
      相关资源
      最近更新 更多