如何解决是 PHP 错误还是我不正确地使用 DateTime->diff?
我试图获得一个可计算的天/周数:从某个日期过去了多少天/周。
date_default_timezone_set('Europe/Moscow');
$beforDate=DateTime::createFromFormat('Y-m-d G:i:s','1900-01-01 00:00:00'); // monday,1-st Jan of 1900
$afterDate=DateTime::createFromFormat('Y-m-d G:i:s','2021-02-08 00:00:42');
$dtInterval = $beforDate->diff($afterDate);
$daysPassed = $dtInterval->days;
echo "days passed if target date have 42 seconds from midnight: $daysPassed" . PHP_EOL;
$afterDate=DateTime::createFromFormat('Y-m-d G:i:s','2021-02-08 00:00:43');
$dtInterval = $beforDate->diff($afterDate);
$daysPassed = $dtInterval->days;
echo "days passed if target date have 43 seconds from midnight: $daysPassed" . PHP_EOL;
在这个例子中,我看到了一个非常奇怪的结果: 如果我只在午夜后将目标日期加一秒,我就会得到加一天。 代码结果:
- 如果目标日期距午夜 42 秒,则过去的天数:44232
- 如果目标日期距午夜 43 秒,则过去的天数:44233
这是一个错误还是我只是愚蠢?
在 PHP7.2、PHP7.4 (Ubuntu 18.04) 上测试,与时区设置无关(我尝试设置 UTC - 没有区别)
如果这是一个错误,您将如何建议一种足够快的方法来获取从某个日期过去的整数天/周数?
更新:
刚刚意识到: 如果我将默认时区设置为
,则会出现错误date_default_timezone_set('Europe/Moscow');
但我不明白时区如何影响它?因为一年在任何时区都有相同的天数
发现另一个不正确的行为:
$beforDate=DateTime::createFromFormat('Y-m-d G:i:s','1900-01-01 00:00:00');
$beforDate->setTimezone(new DateTimeZone('UTC'));
$afterDate=DateTime::createFromFormat('Y-m-d G:i:s','2021-02-08 00:00:00');
$afterDate->setTimezone(new DateTimeZone('UTC'));
$dtInterval = $beforDate->diff($afterDate);
$daysPassed = $dtInterval->days;
echo "1. days passed: $daysPassed" . PHP_EOL;
$afterDate=DateTime::createFromFormat('Y-m-d G:i:s','2021-02-08 00:50:00');
$afterDate->setTimezone(new DateTimeZone('UTC'));
$dtInterval = $beforDate->diff($afterDate);
$daysPassed = $dtInterval->days;
echo "1. days passed if 50 minutes added to target date: $daysPassed" . PHP_EOL;
有输出:
- 过去的天数:44232
- 如果将 50 分钟添加到目标日期,则过去的天数:44233
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。