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

时间:2013-03-22 03:34:42

标签: php mysql date week-number

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

我用PHP执行此操作。

date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312

当我用MySQL执行此操作时

SELECT YEARWEEK(now()); // outputs 201311

3 个答案:

答案 0 :(得分:34)

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

SELECT YEARWEEK(now(),3); 

PHP date()占位符W根据ISO 8601 specification返回周数。这意味着星期一(而不是星期日)开始几个星期,一年的第一周是1号(不是0号),那一周是第一个在新的一年中至少有4天的星期(所以它是包含新年第一个星期四的一周)。根据{{​​3}},选项的组合是模式3.

另外,要将Alles的笔记纳入已接受的答案,因为它很重要:占位符YW不能一起使用。如果您想要与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

答案 1 :(得分:16)

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

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

date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152

因为“o”为您提供本周所属的年份。

我希望这会有所帮助。

答案 2 :(得分:3)

YEARWEEK采用第二个(可选)参数,指定周[0- 53]或[1-53]的范围。

  

此函数返回日期的周数。 两论证形式   WEEK()使您可以指定周是在周日开始还是周日开始   星期一以及返回值是否应该在0到0之间   53或从1到53。如果省略mode参数,则为   使用default_week_format系统变量。

虽然date(W)ISO8601 date,但始终在[01-53]范围内。因此我的猜测是默认情况下YEARWEEK正在使用[0-53]范围。

因此,如果您想获得相同的结果,请尝试使用1作为YEARWEEK的第二个参数