【发布时间】:2013-03-11 19:59:45
【问题描述】:
谁能解释一下为什么这两个给出不同的结果?
我用 PHP 执行这个。
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
当我使用 MySQL 执行此操作时
SELECT YEARWEEK(now()); // outputs 201311
【问题讨论】:
标签: php mysql date week-number
谁能解释一下为什么这两个给出不同的结果?
我用 PHP 执行这个。
date("YW",mktime(0, 0, 0, 3, 22 , 2013)); // outputs 201312
当我使用 MySQL 执行此操作时
SELECT YEARWEEK(now()); // outputs 201311
【问题讨论】:
标签: php mysql date week-number
您需要在 mysql YEARWEEK 调用中指定模式 3:
SELECT YEARWEEK(now(),3);
PHP date() 占位符W 根据ISO 8601 specification 返回星期数。这意味着周从星期一(不是星期日)开始,一年中的第一周是第 1 周(不是 0),并且该周是第一个在新年中有超过一半天数的周(所以它必须是一月星期四)。根据the documentation for the MySQL WEEK function,选项组合是模式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
【讨论】:
date 函数没有内置支持。你必须自己算算。
请注意 YEARWEEK('2012-01-01', 3) => 201152 而 PHP "YW" 将给出 201252。结果中的年份可能与第一个日期参数中的年份不同和一年中的最后一周。 (即 YEARWEEK 中的年份是一周中星期一的年份,而不是用于计算的日期的年份)。
为了得到正确的结果,你需要这样做
date("oW",mktime(0, 0, 0, 1, 1, 2012)); // outputs 201152
因为“o”为您提供一周所属的年份。
我希望这会有所帮助。
【讨论】:
YEARWEEK 采用第二个(可选)参数,指定一周的范围 [0-53] 或 [1-53])。
此函数返回日期的周数。 二元形式 of WEEK() 使您可以指定一周是从星期日开始还是 星期一以及返回值是否应该在 0 到 53 或从 1 到 53。 如果省略 mode 参数,则 使用 default_week_format 系统变量。
而 date(W) 是一个始终在 [01-53] 范围内的 ISO8601 date。因此我的猜测是,默认情况下 YEARWEEK 使用 [0-53] 范围。
因此,如果您想获得相同的结果,请尝试使用 1 作为YEARWEEK 的第二个参数
【讨论】: