Как преобразовать будущую дату в соответствующую временную метку - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть функция, которая принимает строковую дату в формате 24.08.2010 и превращает ее в метку времени.У меня проблема в том, что даты, такие как 24.08.2090, конвертируются неправильно.

Вот моя функция:

/**
* Converts a date to a timestamp
* for a date formatted such as: 08/24/2010 12:00:00, 08-24-2010 12:00:00 or 08/24/2010
* 
* @param string date
* @return string
*/
public static function dateToTimeStamp($date)
{
    if (!strstr($date, ' ')) $date .= ' ' . date('h:i:s');
    list($date, $time) = explode(' ', $date);
    list($month, $day, $year) = (strstr($date, '/') ? explode('/', $date) : explode('-', $date));
    list($hour, $minute, $second) = explode(':', $time);

    $timestamp = mktime($hour, $minute, $second, $month, $day, $year);
    return date('Y-m-d h:i:s', $timestamp);
} 

Я только что прошел 30.09.2090 и получаюназад 1969-12-31 04:00:00, но когда я прохожу 30.09.2020, я возвращаюсь 2020-09-30 08:54:44.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Если вам нужны даты, которые выходят за пределы 32-битного диапазона метки времени Unix, вам следует начать использовать PHP объект datetime , который дает вам диапазон дат, предшествующий большому взрыву, и, вероятно, даже переживетвыгорание солнца

2 голосов
/ 20 сентября 2010

strtotime и mktime страдают от ошибки Y2038 .Временные метки Unix подсчитывают количество секунд с 1 января 1970 года, и если оно использует 32-разрядное целое число, это целое число переполнится 19 января 2038 года, что приведет к тому, что PHP не будет знать, как анализировать дату.

Допустимый диапазон отметок времени обычно от пт, 13 декабря 1901 г. 20:45:54 UTC до вт, 19 января 2038 03:14:07 UTC.(Это даты, которые соответствуют минимальным и максимальным значениям для 32-разрядного целого числа со знаком.) Кроме того, не все платформы поддерживают отрицательные временные метки, поэтому ваш диапазон дат может быть ограничен не ранее эпохи Unix.Это означает, что, например, даты до 1 января 1970 года не будут работать в Windows, некоторых дистрибутивах Linux и некоторых других операционных системах.PHP 5.1.0 и более новые версии преодолевают это ограничение.

Несмотря на то, что говорится в этом предупреждении в руководстве, версии PHP после 5.1 по-прежнему подвержены ошибке 2038 при использовании mktime и strtotime.Однако класс DateTime преодолевает эту ошибку и должен использоваться вместо него.

public static function dateToTimeStamp($date)
{
  if (!strstr($date, ' ')) $date .= ' ' . date('h:i:s');
  $d = new DateTime($date);
  return $d->format('Y-m-d h:i:s');
}

Обратите внимание, что DateTime был добавлен в PHP 5.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...