How to get year-sensitive calendar week ? date(“W”) gives back 52 for 1st of January

后端 未结 3 770
感情败类
感情败类 2020-12-09 13:11

As the headline says, PHP\'s date(\"W\") function gives back the calendar week (for the current day). Unfortunatly it gives back 52 or 53 for the first day(s) of most years.

相关标签:
3条回答
  • 2020-12-09 13:38
    $d = new DateTime('first monday january '.date('Y'));
    echo $d->format("W");
    
    0 讨论(0)
  • 2020-12-09 13:50

    This solution converts the excess of december to week 53 and everything in january prior to week 1 to week 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 ==> week 53 in 2013

    2014-01-01 ==> week 1 in 2014

    2015-12-31 ==> week 52 in 2015

    2016-01-01 ==> week 0 in 2016

    And a small test run, so you can see for yourself ;-)

    $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>';}
    
    0 讨论(0)
  • 2020-12-09 13:50

    Is there a (native) year-sensitive alternative to PHP's date("W") ?

    No, there isn't.

    According to official sources, the first calendar week of a year starts on the first monday of the year.

    I'm not sure what official sources you're referring to.

    PHP's date("W") returns the week number according to ISO 8601. As an international standard, ISO 8601 counts as one of possibly many "official sources". If its definition of week numbers doesn't fit your application, you're free to use anything else you like.

    If you use a non-standard definition of "first week of the year", or if you use an official source that's not widely recognized, expect to have to write your own function to replace date("W"). (I'm pretty sure you'll need to write a function.)

    The date 2012-01-01 was a Sunday. ISO 8601, Wikipedia, and php agree that the ISO week number for 2012-01-01 is 52.

    ISO 8601 doesn't define a week 0.

    So, if the first day of a year is not a monday, it's not week 1 !

    Neither ISO nor Wikipedia say that. ISO 8601 defines week number 1 as the week that has the year's first Thursday in it. For 2012, the first Thursday was on Jan 5, so week number 1 was Jan 2 to Jan 8. 2012-01-01 was in the final week of the previous year, in terms of ISO weeks.

    If you want something different, you can play with arithmetic, division, and so on. (Try dividing date("z") by 7, for example.) Or you can store that data in a database, and have your weeks any way you like.

    If you're dealing with accounting periods, I'd almost certainly store that data in a table in a database. It's pretty easy to generate that kind of data with a spreadsheet.

    The text of data in a table is much easier to audit than the text of a php function, no matter how simple that function is. And the data is certain to be the same for any program that accesses it, no matter what language it's written in. (So if your database someday has programs written in 5 different languages accessing it, you don't have to write, test, and maintain 5 different functions to get the week number.)

    0 讨论(0)
提交回复
热议问题