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
相关产品推荐
相关产品推荐

