为什么strftime('%G',strtotime('2017-01-01'))产生2016?

Bra*_*rts 2 php strftime

我在PHP 5.6中发现了一个可能的错误.strftime带参数的函数%G生成4位数年份.然而,它似乎回归错误的一年1483246800- 即2017年1月1日.它将返回2016年!

示例代码段:

echo strftime('%G', strtotime('2017-01-01'));
Run Code Online (Sandbox Code Playgroud)

这应该打印"2017",但我得到"2016".我正在运行PHP 5.6.这种边缘情况也出现在其他年份 - 例如2016-01-03输出2015而不是2016.

sha*_*vah 8

这不是一个错误.

正如有人在回答错误报告时指出的,其他人提出了一段时间:

%G - 与ISO周数对应的4位数年份(参见%V).它具有与%Y相同的格式和值,除非ISO周数属于上一年或下一年,而是使用该年代 ...提醒有关ISO周数的提醒.它们从星期一开始,在星期日结束,并且被认为是他们大部分时间都在下降的一年的一部分.

这意味着使用%G接近一年开始/结束的日期可以为您提供正确的年份,一年,如您的情况或一年(例如,echo strftime('%Y', strtotime('2002-12-30))给出2003).

如果你想得到正确的年份,你应该使用%Y.echo strftime('%Y', strtotime('2017-01-01'));给2017年.

还值得查看%V的定义:

ISO-8601:1988年给定年份的周数,从一年的第一周开始,至少有4个工作日,周一是本周的开始.