【问题标题】:PHP 8 date week number inconsistent?PHP 8 日期周数不一致?
【发布时间】:2025-11-29 23:15:03
【问题描述】:

当我使用(new DateTime(time()))->format("W") 时,它有时会返回正确的值(15 表示 time() = '1618404852'),但有时它返回不正确的值(16 表示 time() = '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 网站也会出现同样的问题。

【问题讨论】:

  • 您尝试过什么调试问题?你到底卡在哪里了?
  • 标记为正确的答案已经回答了问题。

标签: php date datetime week-number


【解决方案1】:

使用 format("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

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

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

  • 在它们前面加上@
  • 将 createFromFormat 与“U”格式一起使用
  • 创建一个对象,然后对其调用 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

【讨论】:

  • 谢谢,这是完美的答案!
【解决方案2】:

需要在时间戳前传递@,否则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

【讨论】: