php 8 дней создано за неделю - PullRequest
0 голосов
/ 10 октября 2011

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

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

Проблемная строка, я думаю, это array_push ($ aryRange, date ('Ym-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;
  }

}

Ответы [ 4 ]

2 голосов
/ 10 октября 2011

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

$iDateFrom = strtotime("+1 day", $iDateFrom); // add 1 day
1 голос
/ 10 октября 2011

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

1 голос
/ 10 октября 2011

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

$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 часов вручную.

1 голос
/ 10 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...