PHP 8日期周数不一致?

PHP 8 date week number inconsistent?

当我使用 (new DateTime(time()))->format("W") 时,有时 returns 是正确的值(time() = '1618404852' 为 15),但有时 returns 是不正确的值(时间为 16 () = '1618404853').

这些时间戳不完全在两周之间,因为使用“1618404855”作为时间戳将导致 15(这是正确的)。

我的测试代码是:

echo (new DateTime("1618404852"))->format("W");
echo "\n";
echo (new DateTime("1618404853"))->format("W");
echo "\n";
echo (new DateTime("1618404854"))->format("W");
echo "\n";
echo (new DateTime("1618404855"))->format("W");
echo "\n";
echo (new DateTime("1618404856"))->format("W");

这导致:

15
16
16
15
15

这对我来说毫无意义。 我是不是做错了什么?

我已经在本地 php-Server (8.0.0) 以及另一台机器 运行 apache-php (7.4) 上试过了。 使用 phpfiddle 网站会导致同样的问题。

使用格式 ("Y-m-d H:i:s") 显示每个示例的完整日期揭示了这里发生的事情 (demo):

4852-04-14 16:18:40
4853-04-14 16:18:40
4854-04-14 16:18:40
4855-04-14 16:18:40
4856-04-14 16:18:40

默认构造函数试图猜测您的字符串的含义,并猜测最后四位数字是年份。

要强制它将字符串视为时间戳,您可以:

  • @
  • 作为前缀
  • 使用具有 'U' 格式的 createFromFormat
  • 创建一个对象,然后对其调用 setTimestamp
echo (new DateTime("1618404852"))->format("Y-m-d H:i:s");
// 4852-04-14 16:18:40
echo (new DateTime("@1618404852"))->format("Y-m-d H:i:s");
// 2021-04-14 12:54:12
echo DateTime::createFromFormat("U", "1618404852")->format("Y-m-d H:i:s");
// 2021-04-14 12:54:12
echo (new DateTime)->setTimestamp(1618404852)->format("Y-m-d H:i:s");
// 2021-04-14 12:54:12

您需要在时间戳之前传递@,否则PHP会将时间戳解析为错误的日期

echo (new DateTime("1618404852"))->format("c"); // `c` is the ISO-8601
// prints "4852-04-14T16:18:40-08:00", the year 4852
echo (new DateTime("@1618404852"))->format("c"); // `c` is the ISO-8601
// prints "2021-04-14T12:54:12+00:00", correct year