#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
.
Комментарии:
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 часов.