【问题标题】:hh:mm:ss difference return wrong answer in phphh:mm:ss 差异在 php 中返回错误答案
【发布时间】:2017-04-08 03:51:47
【问题描述】:

我正在使用此代码来计算时间段。实际上,我想要两个 HH:MM:SS 时刻之间的句点,并得到 HH:MM:SS 格式的结果。

$time1 = strtotime('00:00:00');
$time2 = strtotime('00:00:07');
$diff = $time2 - $time1;
$diff = date('H:i:s', $diff);

我期待00:00:07,但我得到01:00:07。可能是什么问题?

Irvin 运行here,并得到正确答案,但我在本地机器上运行相同的代码并且错误! 是时区还是某些配置会影响结果?!

【问题讨论】:

  • 我的演示一切正常。与您完全相同的代码。结果是00:00:07eval.in/684340
  • @Irvin,我在本地机器上运行,它给了我 01:00:07,这太疯狂了!但也许它取决于时区!!??
  • 是的,它可能是。
  • 是的,可能是时区问题。 $diff 是 UTC 时间戳,但 date() 在当前时区生成输出。您大概比 UTC 晚 1 小时。
  • 简单修复:date_default_timezone_set('UTC');

标签: php datetime


【解决方案1】:

请停止使用strtotimedate 函数。使用DateTime 类。

如果您能更好地搜索,那么发现两个日期的差异已经很普遍了。比如我的回答here。稍微改变一下它看起来像:

$create_time = "00:00:00";
$current_time="00:00:07";

$dtCurrent = DateTime::createFromFormat('H:i:s', $current_time);
$dtCreate = DateTime::createFromFormat('H:i:s', $create_time);
$diff = $dtCurrent->diff($dtCreate);

echo $diff->format("%H:%I:%S"); // to get HH:MM:SS format

这将返回00:00:07 请参阅DateInterval::format 了解更多格式详细信息。

【讨论】:

  • @Nordenheim,我会接受解决它的答案,你的答案很好,但有时时间格式不正确,它会停止我的代码,我不希望它发生,在我以前方法,即使它们不是像 HH:MM:SS 这样的正确格式,它也不会给我内部错误。你知道在创建对象失败的情况下如何忽略对象错误吗!
  • @FarzadSalimiJazi 有很多可能的答案,从 error_reporting 设置开始,到您可能拥有的设计和实施不佳的架构结束。这一切都取决于您拥有的代码,并且可能需要进行重大重构。要获得有关后者的建议,请访问 Code Review
  • 大家:我刚刚清理了cmets中的很多杂物。 cmets 不用于扩展讨论。请不要用它们来开始或结束关于 OOP 是否令人惊叹、失败的实验或其他什么的战争。谢谢。
【解决方案2】:

这是因为当你从时间 2 减去时间 1 时,你会得到 7;

date函数需要时间戳,7不是时间戳。

您可以改用http://php.net/manual/en/datetime.diff.php 来计算差异吗?

【讨论】:

  • 但我认为,它应该给我 00:00:07 和 7!
【解决方案3】:

本质上,您应该考虑取消 ini 设置中的时区差异的 UNIX 纪元。现在是 70 年 1 月 1 日。您可以通过添加e, O or P 检查您的服务器/应用程序的时区设置。检查this code

$time1 = strtotime('00:00:00 +0000');
$time2 = strtotime('00:00:07 +0000');
$epoch = strtotime('01 Jan 1970');
$diff = $time2 - $time1;
var_dump($time1,$time2,$epoch,$diff);
$diff = date('H:i:s', $epoch+$diff);
echo $diff;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2018-10-03
    • 2014-12-04
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多