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
当我使用 (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