PHP日期('W')vs MySQL YEARWEEK(now())

Pra*_*sha 13 php mysql date week-number

有人可以向我解释为什么这两个会给出不同的结果吗?

我用PHP执行它.

date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
Run Code Online (Sandbox Code Playgroud)

当我用MySQL执行它时

SELECT YEARWEEK(now()); // outputs 201311
Run Code Online (Sandbox Code Playgroud)

Mar*_*eed 35

您需要在mysql YEARWEEK调用上指定模式3:

SELECT YEARWEEK(now(),3); 
Run Code Online (Sandbox Code Playgroud)

PHP date()占位符W根据ISO 8601规范返回周数.这意味着星期一(而不是星期日)的星期开始,一年的第一周是1号(不是0),那个星期是第一个在新的一年中至少有4天的星期(因此它是包含新星期的一周)今年的第一个星期四).根据MySQL WEEK函数的文档,这些选项组合是模式3.

此外,将Alles的笔记纳入已接受的答案,因为它很重要:占位符Y并且W不要一起使用.如果你想要与ISO周数相符的年份,你应该使用o而不是Y.例如,考虑2014年12月29日星期一:

date('YW', mktime(0,0,0,12,29,2014));  #=> 201401 : 1st week of 2014??
date('oW', mktime(0,0,0,12,29,2014));  #=> 201501 : better
Run Code Online (Sandbox Code Playgroud)


All*_*les 16

请注意,YEARWEEK('2012-01-01',3)=> 201152,而PHP"YW"将给出201252.结果中的年份可能与第一个和最后一个的日期参数中的年份不同一年中的一周.(即YEARWEEK中的年份是本周一的年份,而不是用于计算的日期的年份).

为了获得正确的结果,您需要这样做

date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152
Run Code Online (Sandbox Code Playgroud)

因为"o"给你一周所属的年份.

我希望这有帮助.