【问题标题】:Why does strftime('%G', strtotime('2017-01-01')) produce 2016?为什么 strftime('%G', strtotime('2017-01-01')) 会产生 2016?
【发布时间】:2017-05-21 15:43:57
【问题描述】:

我在 PHP 5.6 中发现了一个可能的错误。带有%G 参数的函数strftime 生成4 位数的年份。但是,当喂食1483246800 时,它似乎返回了错误的年份 - 即 2017 年 1 月 1 日。它改为返回 2016 年!

示例代码sn-p:

echo strftime('%G', strtotime('2017-01-01'));

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

【问题讨论】:

  • 你的语言环境是什么?
  • 这是从星期一开始的 ISO 周数,因此 2017 年 1 月 1 日是星期日,即从 2016 年 12 月 26 日星期一开始的那一周。也许您想改用 Y。跨度>

标签: php strftime


【解决方案1】:

这不是错误。

作为someone pointed out 回复其他人不久前提交的错误报告:

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

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

如果你想得到正确的年份,你应该改用%Yecho strftime('%Y', strtotime('2017-01-01')); 2017 年。

也值得一试the definition of %V

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

【讨论】:

  • 现在这很有意义,所以从技术上讲,如果操作员输入 echo strftime('%G', strtotime('2017-01-02')); 他会得到 2017 年?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2021-02-17
  • 2018-09-04
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多