You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中YW日期格式在2023年初失效的原因及解决方案咨询

PHP 年份+周数排序混乱问题的原因与解决办法

问题原因

你遇到的问题是ISO周规则与date('Y')取当前年份的冲突导致的:

  • ISO周的定义是:每周从周一开始,一年的第一周必须包含当年的1月4日(或者说该周至少有4天在当年)。
  • 2023年1月1日是周日,按照ISO规则,这一天属于2022年的第52周,但date('Y')取的是当前日期的公历年份(2023),date('W')取的是ISO周数(52),二者组合就得到了202352。
  • 从2023年1月2日(周一)开始,进入2023年的第1周,生成202301。数字排序时202301会排在202352前面,完全打乱了时间顺序。

解决办法

最直接且符合ISO标准的修复方式是用ISO周对应的年份代替公历年份:

  • 把格式符从YW改成oW,其中o表示ISO周所属的年份,这样跨年度的周数会自动匹配正确的年份。
  • 修正后的代码:
$weekNum = (int) date('oW', $myDate);

这样2023年1月1日会生成202252,后续日期生成202301、202302... 数字排序时就能严格按照时间顺序排列。

如果业务上必须使用公历年份的周数(不遵循ISO规则),可以改用z格式符计算一年中的第几天,再转换为周数(每周按7天算),但这种方式不兼容国际标准,仅适合特定业务场景:

// 计算公历年份内的周数(从1开始)
$dayOfYear = (int) date('z', $myDate);
$weekNum = (int) date('Y', $myDate) . str_pad(floor($dayOfYear / 7) + 1, 2, '0', STR_PAD_LEFT);

内容的提问来源于stack exchange,提问作者WPDavid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:46:01