首页 > 解决方案 > 循环生成一年中的几周并不总是正确的

问题描述

我想遍历一个日期范围内的所有星期(从星期一到星期日):

function getInfoWeeks($date_start, $date_end) {
   $start    = new DateTime($date_start);
   $start2    = new DateTime($date_end);
   $year_number = $start->format('Y');
   $end      = new DateTime($data_fine);
   $interval = new DateInterval('P1W');
   $period   = new DatePeriod($start, $interval, $end);
   foreach ($period as $date) {
      $week = new stdClass();
      $firstday = $start -> setISODate( $year_number, (int)$date -> format('W'), 1 ); 
      $lastday = $start2 -> setISODate( $year_number, (int)$date -> format('W'), 7 ); 
      $week -> period = $date->format('d-m-Y');
      $week -> month = strftime("%B", $date -> getTimestamp());
      $week -> monthNr = (int)$date -> format('m');
      $week -> nr = $date -> format('W');
      $week -> firstday = $firstday->format('d-m-Y');
      $week -> lastday = $lastday->format('d-m-Y');
      $week -> year_number = $year_number;
      $array_week[] = $week;
   }
return $array_week;}

对于 getInfoWeeks("2020-01-01", "2020-12-31") 是正确的,我明白了:

Array
(
    [0] => stdClass Object
        (
            [period] => 01-01-2020
            [month] => gennaio
            [monthNr] => 1
            [nr] => 01
            [firstday] => 30-12-2019
            [lastday] => 05-01-2020
            [year_number] => 2020
        )

    [1] => stdClass Object
        (
            [period] => 08-01-2020
            [month] => gennaio
            [monthNr] => 1
            [nr] => 02
            [firstday] => 06-01-2020
            [lastday] => 12-01-2020
            [year_number] => 2020
        )...

但是对于 getInfoWeeks("2021-01-01", "2021-12-31") 对于 array[0] 来说是错误的,因为有 2022:

Array
(
    [0] => stdClass Object
        (
            [period] => 01-01-2021
            [month] => gennaio
            [monthNr] => 1
            [nr] => 53
            [firstday] => 03-01-2022
            [lastday] => 09-01-2022
            [year_number] => 2021
        )

    [1] => stdClass Object
        (
            [period] => 08-01-2021
            [month] => gennaio
            [monthNr] => 1
            [nr] => 01
            [firstday] => 04-01-2021
            [lastday] => 10-01-2021
            [year_number] => 2021
        )
    ...

为什么 2020 年是可以的,而 2021 年(以及 2022 年)是错误的?哪里错了?

标签: phpdatetime

解决方案


我不明白我错在哪里,所以为了解决我添加了这个条件

foreach ($period as $date) { $i++; ... if ($i == 1 && $week->nr = 53) continue;

...它不是很优雅,但它有效


推荐阅读