如何获得对年度敏感的日历周?日期(“W”)给出了1月1日的52

时间:2012-07-26 13:48:30

标签: php date week-number

正如标题所说,PHP的日期(“W”)函数返回日历周(当天)。不幸的是,它在大多数年份的第一天给出了52或53。这是一个简单的思维方式,正确,但非常烦人,因为2012年1月1日不是日历周52,它不是当年的日历周。大多数日历将此定义为上一年的第0周或第52周。

当您将一年中的每一天按日历周分组时,这非常棘手:2012年1月1日和2012年12月31日都被放入同一日历周组。

所以我的问题是:是否存在对PHP日期(“W”)的(本机)年度敏感替代方案?

编辑:我认为我以非常不明确的方式编写了这个问题的第一个版本,所以这是我的编辑:我正在搜索一个功能,它会在第一天返回正确的日历周。年。 PHP的日期(“W”)给出了2012年1月1日的52,这是“错误的”。它应该是0或null。据官方消息称,一年中的第一个日历周从一年的第一个星期一开始。所以,如果一年的第一天不是星期一,那就不是第1周!这是第0周。wikipedia article

如果1月1日是星期一,星期二,星期三或星期四,则是01周。如果1月1日是星期五,星期六或星期日,则是上一年的第52周或第53周。

这变得棘手,因为今年的最后几天也是在第52/53周。日期(“W”)不分为当年和上一年。

3 个答案:

答案 0 :(得分:9)

此解决方案将12月份的剩余部分转换为第53周以及1周至第0周之前的所有内容。

$w=(int)date('W');
$m=(int)date('n');
$w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);

echo "week $w in ".date('Y');

2013-12-31 ==> 2013年第53周

2014-01-01 ==> 2014年第1周

2015-12-31 ==> 2015年第52周

2016-01-01 ==> 2016年第0周

一个小小的试运行,所以你可以自己看看; - )

$id=array(25,26,27,28,29,30,31,1,2,3,4,5,6,7,8);        
for($iy=2013;$iy<2067;++$iy){foreach($id as $k=>$v){if($k<7){$im=12;}else{$im=1;}
if($k==7){++$iy;echo '====<br>';}$tme=strtotime("$im/$v/$iy");
echo date('d-m-Y',$tme),'  * *  ';
//THE ACTUAL CODE =================
    $w=(int)date('W',$tme);
    $m=(int)date('n',$tme);
    $w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);
//THE ACTUAL CODE =================
echo '<b>WEEK: ',$w,' --- ','YEAR: ',date('Y',$tme),'</b><br>';}--$iy;
echo '----------------------------------<br>';}

答案 1 :(得分:2)

  

是否存在对PHP日期(“W”)的(本机)年度敏感的替代方法?

不,没有。

  

据官方消息称,一年中的第一个日历周从一年的第一个星期一开始。

我不确定你指的是哪些官方消息来源。

PHP的date("W")根据ISO 8601返回周数。作为国际标准,ISO 8601可能是许多“官方来源”之一。如果其周数的定义不适合您的应用程序,您可以自由使用您喜欢的任何其他内容。

如果您使用“一年中的第一周”的非标准定义,或者您使用未被广泛认可的官方来源,则必须编写自己的函数来替换date("W")。 (我很确定你需要写一个函数。)

2012-01-01的日期是星期天。 ISO 8601,Wikipedia和php同意2012-01-01的ISO周数为52。

ISO 8601未定义第0周。

  

所以,如果一年的第一天不是星期一,那就不是第1周了!

ISO和维基百科都没有这么说。 ISO 8601将第1周定义为第一周的第一周。对于2012年,第一个星期四是1月5日,所以1号星期是1月2日到1月8日。对于ISO周,2012-01-01是在上一年的最后一周。

如果你想要不同的东西,你可以玩算术,除法等。 (例如,尝试将日期(“z”)除以7。)或者您可以将数据存储在数据库中,并以您喜欢的方式保存您的周。

如果您正在处理会计期间,我几乎肯定会将该数据存储在数据库的表中。使用电子表格生成这类数据非常容易。

表格中的数据文本比php函数的文本更容易审计,无论函数多么简单。无论用什么语言编写,任何访问它的程序的数据都是一样的。(所以如果你的数据库有一天会用5种不同的语言编写程序来访问它,你就不必编写,测试,并维护5个不同的函数来获得周数。)

答案 2 :(得分:1)

$d = new DateTime('first monday january '.date('Y'));
echo $d->format("W");