вот некоторые отладочные выражения, которые я вставляю в eclipse, если вы мне не верите:
"strtotime("2110-07-16 10:07:47")" = (boolean) false "strtotime("2110-07-16")" = (boolean) false
я использую его в своей функции, которая возвращает случайную дату между датой начала и окончания:
public static function randomDate($start_date, $end_date, $format = DateTimeHelper::DATE_FORMAT_SQL_DATE) { if($start_date instanceof DateTime) $start_date = $start_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS); if($end_date instanceof DateTime) $end_date = $end_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS); // Convert timetamps to millis $min = strtotime($start_date); $max = strtotime($end_date); // Generate random number using above bounds $val = rand($min, $max); // Convert back to desired date format return date($format, $val); }
любая идея, как заставить его вернуть правильное время unix для будущей даты?
благодаря!
Если вы хотите работать с датами, которые выходят за пределы 32-битного целочисленного диапазона дат, используйте PHP-объекты dateTime
try { $date = new DateTime('2110-07-16 10:07:47'); } catch (Exception $e) { echo $e->getMessage(); exit(1); } echo $date->format('Ym-d');
Попробуйте сохранить его до Tue, 19 января 2038 03:14:07 UTC, когда эпоха времен временного интервала unix для 32-битных систем перевернется!
Это даже описано в руководстве по адресу http://php.net/strtotime
edit: Просто протестировано: оно исправлено установкой 64-битной ОС и соответствующей 64-разрядной версии php. Думаю, у нас есть достаточно времени, чтобы исправить перевоплощенную ошибку тысячелетия:
$one = strtotime("9999-12-31 23:59:59"); $two = strtotime("10000-01-01 00:00:00"); var_dump($one); var_dump($two); int(253402297199) bool(false)
Из руководства по PHP :
Допустимый диапазон временной отметки – от Fri, 13 Dec 1901 20:45:54 GMT до Tue, 19 января 2038 03:14:07 GMT. (Это даты, соответствующие минимальным и максимальным значениям для 32-разрядного целого числа со знаком). Однако до PHP 5.1.0 этот диапазон был ограничен с 01-01-1970 по 19-01-2038 на некоторых системах (например, Windows).
См. Также: Проблема 2038 года – Википедия
Вы не можете конвертировать даты, которые происходят после временного опроса unix (2038)
Простая замена strtotime
$date = '2199-12-31T08:00:00.000-06:00'; echo date('Ym-d', strtotime($date)); // fails with 1970 result echo date_format( date_create($date) , 'Ym-d'); // works perfect with 5.2+
Фактический пост здесь .