Добавление лет к дате сбрасывается до 1970-01-01
$somedate = "1980-02-15";
$otherdate = strtotime('+1 year', strtotime($somedate));
echo date('Y-m-d', $otherdate);
выходы
1981-02-15
а также
$somedate = "1980-02-15";
$otherdate = strtotime('+2 year', strtotime($somedate));
echo date('Y-m-d', $otherdate);
выходы
1982-02-15
но
$somedate = "1980-02-15";
$otherdate = strtotime('+75 year', strtotime($somedate));
echo date('Y-m-d', $otherdate);
выходы
1970-01-01
Как исправить?
5 ответов
Это ошибка 2038 года, похожая на y2k, когда системы не могут обрабатывать даты после этого года из-за 32-битных ограничений. Вместо этого используйте класс DateTime, который обходит эту проблему.
Для PHP 5.3+
$date = new DateTime('1980-02-15');
$date->add(new DateInterval('Y75'));
echo $date->format('Y-m-d');
Для PHP 5.2
$date = new DateTime('1980-02-15');
$date->modify('+75 year');
echo $date->format('Y-m-d');
strtotime() использует метку времени Unix, поэтому она переполняется, если пытается вычислить годы после 2038 года, и возвращается к 1970 году.
Чтобы обойти это, используйте объект DateTime. http://php.net/manual/en/book.datetime.php
Чтобы добавить период времени к объекту DateTime, используйте DateTime::add, который принимает DateInterval в качестве параметра. http://php.net/manual/en/datetime.add.php http://www.php.net/manual/en/class.dateinterval.php
$date = new DateTime("1980-02-15");
if (method_exists("DateTime", "add")) {
$date->add(new DateInterval("Y75"));
} else {
$date->modify("+75 years");
}
echo $date->format("Y-m-d");
Для метки времени Unix максимальное представляемое время - 2038-01-19. В 03:14:07 UTC.
Таким образом, вы не можете представить / оперировать временем, используя метку времени.
Даты PHP ограничены диапазоном от 01-01-1970 до 19-01-2038. Вам придется использовать другой метод для работы с датами.
У PEAR есть класс Date: PEAR Date
75 лет с 1980 года - это 2055 год, что превышает максимальное значение даты, которое может быть представлено в 32-разрядном целом числе. Следовательно, результат становится 0, что является датой 1970 года, которую вы наблюдаете.