Как найти, является ли дата допустимой датой, и не больше, чем 2038 год?

У меня есть сайт, где пользователи обеспечивают некоторые даты, но если они вводят год как 12 апреля 2099, затем я получает дату в прошлом (1969). Как я проверяю его и применяю значение по умолчанию макс. безопасная дата?

спасибо.

5
задан user187580 30 April 2010 в 15:06
поделиться

2 ответа

Попробуйте использовать DateTime классы

$dt = new DateTime('2099-01-01');
$dt->setTime(23,59);
$dt->add(new DateInterval('P10D'));
echo $dt->format('Y-m-d H:i:s'); // 2099-01-11 23:59:00

Не уверен, что DateTime использует внутри для хранения метки времени вместо целых чисел. Но целые числа ограничены значением вашей платформы для PHP_INT_MAX . Вы можете проверить это, отформатировав дату и время с помощью 'U' (для метки времени) и передав его в date () :

echo date('Y-m-d H:i:s', $dt->format('U')); // 1962-12-06 17:30:44

Обратите внимание, как DateTime возвращает правильную метку времени, но date не может с ним работать:

var_dump(
    $dt->format('U'),                           // 4071855540
    date('U', $dt->format('U')),                // -223111756
    PHP_INT_MAX,                                // 2147483647
    PHP_INT_MAX+1,                              // -2147483648
    date('Y-m-d H:i:s', PHP_INT_MAX),         // 2038-01-19 04:14:07
    date('Y-m-d H:i:s', PHP_INT_MAX+1)        // 1901-12-13 21:45:52
);
5
ответ дан 14 December 2019 в 19:06
поделиться

Вы можете использовать функцию mktime . Если указана дата с пт, 13 декабря 1901 г., 20:45:54 по Гринвичу по вт, 19 января 2038 г., 03:14:07 по Гринвичу , возвращается количество секунд с эпохи иначе он вернет false .

var_dump(mktime(0, 0, 0, 1, 19, 2038)); // int(2147472000) 
var_dump(mktime(0, 0, 0, 1, 20, 2038)); // bool(false)
0
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: