2013-03-22 61 views

回答

33

您需要对MySQL的YEARWEEK呼叫指定模式3执行此:

SELECT YEARWEEK(now(),3); 

的PHP date()占位根据W返回周数到ISO 8601 specification。这意味着星期一从星期一开始(不是星期天),一年中的第一周是第一天(不是0),而这一周是第一天至少有4天在新的一年(所以这是包含新的一周的一周今年的第一个星期四)。据the documentation for the MySQL WEEK function的选项组合模式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 
+0

谢谢马克。它的工作原理是 – 2013-03-22 03:45:56

+0

+1,但如果我想用YEARWEEK来每周汇总数据,并且希望星期天是一周的第一天,该怎么办?PHP似乎没有改变周开始日的选项 – dzona 2014-02-01 16:51:15

+0

这就是第二个参数(“模式”)指定的内容。阅读文档链接...模式0,2,4和6都在周日开始,周第一周是不同的,以及是否有第0周或第53周。 – 2014-02-01 17:41:56

3

YEARWEEK需要一秒钟(可选)参数指定星期[O- 53]或[1-53]的范围内)。

该函数返回日期的星期数。 WEEK()的双参数形式 可让您指定星期一开始于星期天还是星期一 以及返回值是否应在0至 53或1至53的范围内。如果模式参数被省略,则使用 default_week_format系统变量的值。

date(W)ISO8601 date,总是在[01-53]的范围内。因此我猜测YEARWEEK默认使用的是[0-53]范围。

所以,如果你想获得相同的结果尝试使用1作为第二个参数为YEARWEEK

16

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

为了得到正确的结果,你需要做的

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

为“O”为您提供了新年的一周属于。

我希望这会有所帮助。

+0

谢谢你! – Kostanos 2013-08-01 18:34:48

+0

谢谢你的提示 - 今天节省了我很多困惑和潜在的头痛,因为今天是明年的一部分。 – cincodenada 2014-12-29 19:24:42