php 8 дней, созданных для недели

#php #date

#php #Дата

Вопрос:

У меня есть следующий код, который создает список дат между диапазонами. Если я укажу день недели, он получит все даты для этих дат в диапазоне. Если я этого не сделаю, он получит все дни.

Моя проблема в том, что с 24 октября по 29 октября он возвращает дополнительный день. Я заметил это раньше, когда я добавил дополнительный код, чтобы получить даты дня недели.

Проблемная строка, я думаю, array_push($aryRange,date(‘Y-m-d’,$iDateFrom)); // первая запись

 function createDateRangeArray($strDateFrom,$strDateTo,$dateOfWeek=null) {
  // takes two dates formatted as YYYY-MM-DD and creates an
  // inclusive array of the dates between the from and to dates.

  // could test validity of dates here but I'm already doing
  // that in the main script

  $aryRange=array();

  $iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),substr($strDateFrom,8,2),substr($strDateFrom,0,4));
  $iDateTo=mktime(1,0,0,substr($strDateTo,5,2),substr($strDateTo,8,2),substr($strDateTo,0,4));

  if ($iDateTo>=$iDateFrom) {

    if(!isset($dateOfWeek)) {   
        array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry

        while ($iDateFrom<$iDateTo) {
          $iDateFrom =86400; // add 24 hours
          array_push($aryRange,date('Y-m-d',$iDateFrom));
        }
    } else {

        while ($iDateFrom<$iDateTo) {
          if(date('w',$iDateFrom)==$dateOfWeek)
              array_push($aryRange,date('Y-m-d',$iDateFrom));
              $iDateFrom =86400; // add 24 hours
        }       
    }
  }

  if(count($aryRange)<1){
    return false;
  } else{
    return $aryRange;
  }

}
  

Комментарии:

1. Посмотрите на использование класса DateTime. us2.php.net/manual/en/class.datetime.php

Ответ №1:

Не было бы проще использовать функцию strtotime()? http://php.net/manual/en/function.strtotime.php

 $iDateFrom = strtotime(" 1 day", $iDateFrom); // add 1 day
  

Ответ №2:

Вы должны учитывать daylight saving time .

-> http://en.wikipedia.org/wiki/Daylight_saving_time

Комментарии:

1. Спасибо за это, это было именно то, в чем заключалась проблема.

Ответ №3:

Вы добавляете 24 часа каждый раз. Это не совсем то же самое, что добавление дня. Я сильно подозреваю, что вы работаете в часовом поясе, где часы возвращаются 23 октября или 30 октября, и это портит ваши вычисления.

Мне не совсем ясно, какое лучшее решение для вас здесь, но, надеюсь, объяснение того, что происходит, будет хорошим началом…

Ответ №4:

Быстрое и грязное решение — добавить пару часов разницы во времени к датам, которые вы сравниваете. Таким образом, переход на летнее время не влияет на вычисления настолько, чтобы отбросить их.

 $iDateFrom=mktime(12,0,0,substr($strDateFrom,5,2),substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2),substr($strDateTo,8,2),substr($strDateTo,0,4));
  

Лучшим решением является использование функций управления фактической датой вместо ручного добавления 24 часов.