正如 Headers 所说,PHP的日期(“W”)函数返回日历周(当天) . 不幸的是,它在大多数年份的第一天给出了52或53 . 这是一个简单的思维方式,正确,但非常烦人,因为2012年1月1日不是日历周52,它不是当年的日历周 . 大多数日历将此定义为上一年的第0周或第52周 .
当您按照日历周对每年的每一天进行分组时,这非常棘手:2012年1月1日和2012年12月31日都被放入同一个日历周组 .
So my question is: Is there a (native) year-sensitive alternative to PHP's date("W") ?
编辑:我想我以非常不清楚的方式写了这个问题的第一个版本,所以这是我的编辑:我'm searching for a function that gives back the correct calendar week for the first day(s) of the year. PHP' s date("W")给出了2012年1月1日的52,即"wrong" . 它应该是0或null . 据官方消息称,一年中的第一个日历周从一年的第一个星期一开始 . 所以,如果一年的第一天不是星期一,那么第一周就是's not week 1 ! It' . wikipedia article说
如果1月1日是星期一,星期二,星期三或星期四,则是01周 . 如果1月1日是星期五,星期六或星期日,则是上一年的第52周或第53周 .
这变得棘手,因为今年的最后几天也是在第52/53周 . 日期(“W”)不分为当年和上一年 .
3 回答
该解决方案将12月的过量转换为第53周以及1周至第0周之前的所有内容 .
2013-12-31 ==> 2013年第53周
2014-01-01 ==> 2014年第1周
2015-12-31 ==> 2015年第52周
2016-01-01 ==> 2016年第0周
还有一个小试运行,所以你可以自己看看;-)
不,没有 .
我不确定你指的是哪些官方消息来源 .
PHP的
date("W")
根据ISO 8601返回周数 . 作为国际标准,ISO 8601可能是"official sources"之一 . 如果它的周数的定义不能自由地使用你喜欢的任何其他东西 .如果使用"first week of the year"的非标准定义,或者如果使用未被广泛认可的官方来源,则必须编写自己的函数来替换
date("W")
. (我'm pretty sure you'我需要写一个函数 . )2012-01-01的日期是星期天 . ISO 8601,Wikipedia和php同意2012-01-01的ISO周数为52 .
ISO 8601未定义第0周 .
ISO和维基百科都没有这么说 . ISO 8601将第1周定义为第一周的第一周 . 对于2012年,第一个星期四是1月5日,所以1号星期是1月2日到1月8日 . 对于ISO周,2012-01-01是在上一年的最后一周 .
如果你想要不同的东西,你可以玩算术,除法等 . (例如,尝试将日期(“z”)除以7 . )或者您可以将数据存储在数据库中,并以您喜欢的方式保存您的周 .
如果您正在处理会计期间,我几乎肯定会将这些数据存储在数据库的表中 . 使用电子表格生成这种数据非常容易 .
无论函数多么简单,表中数据的文本都比php函数的文本更容易审计 . 无论用什么语言编写,任何访问它的程序的数据都是一样的 . (所以如果你的数据库有一天会用5种不同的语言编写程序来访问它,你就不必编写,测试,并维护5个不同的函数来获得周数 . )