PHP Выяснение будущих дат повторяющегося события - работает только до 2037 года? - PullRequest
1 голос
/ 08 августа 2011

Я пишу веб-приложение на основе календаря и работаю над кодом, который зациклится X раз и определит даты и время начала / окончания будущих событий.Каждое событие имеет начальную дату / время и конечную дату / время. Цикл прекрасно работает до 2037 года, после чего цикл работает должным образом.Преобразование никогда не происходит и возвращает мои даты назад к 1969 году. Пожалуйста, смотрите код и вывод ниже.Может кто-нибудь сказать мне, почему это происходит?

Live Пример проблемного поведения: http://codepad.org/h5ET3h2O

$date1 = strtotime('August 17 2011 8:00 AM');

for ($x=1; $x<=$repeatTimes; $x++){

    echo date('m/d/Y g:i A', $date1)."<br><br>".$date1 ." +". $repeatFreq." ".$repeatUnit. " = ";
    $date1 = strtotime(date('m/d/Y g:i A', $date1) . " +".$repeatFreq." ".$repeatUnit );
    echo $date1."<br /><br />";


}

Вывод

08/15/2011 8:00 AM
1313409600 +1 Year = 1345032000

08/15/2012 8:00 AM
1345032000 +1 Year = 1376568000

08/15/2013 8:00 AM
1376568000 +1 Year = 1408104000

//Some Left Out

08/15/2036 8:00 AM
2102414400 +1 Year = 2133950400

//Problem starts here

08/15/2037 8:00 AM
2133950400 +1 Year = 

12/31/1969 7:00 PM
+1 Year = 31536000

12/31/1970 7:00 PM
31536000 +1 Year = 63072000

12/31/1971 7:00 PM
63072000 +1 Year = 94694400

12/31/1972 7:00 PM
94694400 +1 Year = 126230400

12/31/1973 7:00 PM
126230400 +1 Year = 157766400

12/31/1974 7:00 PM
157766400 +1 Year = 189302400

//Some Left Out

ОБНОВЛЕНИЕ

Мне удалось использовать класс DateTime для правильной работы даты.

for ($x=1; $x<=$repeatTimes; $x++){
    $date1->modify(" +".$repeatFreq." ".$repeatUnit);
    $sDates[]=$date1->format('m/d/Y g:i A');
}

1 Ответ

6 голосов
/ 08 августа 2011

http://en.wikipedia.org/wiki/Unix_time

Вы достигли максимального значения 32-разрядного целого числа.

Время измеряется как количество секунд с 1 января 1970 года по Гринвичу. Вы видите 1969, потому что в вашем часовом поясе, это когда это произойдет. Когда число секунд переполняет 32-битное целое число, оно возвращается обратно.

Вы можете подтвердить максимальное целое значение следующим образом: echo PHP_INT_MAX;.

Если вам нужны 64-битные целые числа, вам нужно использовать 64-битное оборудование и 64-битную версию PHP (что обычно в наши дни вы должны скомпилировать самостоятельно , а я я не верю, что официальные двоичные файлы доступны на PHP.net).

Есть и другие варианты. Смотрите здесь: Как получить 64-битное целое число на PHP?

Редактировать: Согласно предложению Maerlyn, вам следует рассмотреть возможность использования класса DateTime, встроенного в последние версии PHP . Это должно помочь вам решить эту проблему, если вы используете его последовательно.

...