首页 文章

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

提问于
浏览
7

正如 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 回答

  • 1

    该解决方案将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>';}
    
  • 9

    对于PHP的日期(“W”),是否有(本机)年份敏感的替代方法?

    不,没有 .

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

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

    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周 .

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

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

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

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

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

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

相关问题