Допустимые форматы даты/времени

Содержание

В этом разделе описываются все различные форматы, которые принимает парсер: DateTimeImmutable, DateTime, date_create_immutable(), date_create(), date_parse() и strtotime(). Форматы сгруппированы по разделам. В большинстве случаев форматы из разных разделов, разделённые пробелом, запятой или точкой, могут использоваться в одной и той же строке даты/времени. Для каждого из поддерживаемых форматов приведены один или несколько примеров, а также описание формата. Символы в одинарных кавычках нечувствительны к регистру ('t' эквивалентно как t, так и T), символы в двойных кавычках чувствительны к регистру ("T" означает только T).

Следует принять во внимание общий свод правил.

  1. Парсер допускает для каждой единицы измерения (год, месяц, день, час, минута, секунда) полный диапазон значений. Для года это всего 4 цифры, для месяца - 0-12, дня - 0-31, для часа - 0-24, а для минуты - 0-59.
  2. Для секунд допускается значение 60, так как иногда строки даты с этой прыгающей секундой действительно появляются. Но PHP реализует время Unix, где "60" не является допустимым числом секунд и поэтому происходит переполнение.
  3. Функция strtotime() возвращает false, если какое-либо число находится вне диапазонов, а конструктор DateTimeImmutable::__construct() выбрасывает исключение.
  4. Если строка содержит дату, все элементы времени обнуляются до 0.
  5. Все менее значимые элементы времени сбрасываются до 0, если в данной строке присутствует какая-либо часть времени.
  6. Парсер не делает никаких проверок, чтобы сделать его быстрее (и более универсальным).
  7. Существует дополнительная проверка, если указана недействительная дата:

    <?php
    $res 
    date_parse("2015-09-31");
    var_dump($res["warnings"]);
    ?>

    Результат выполнения данного примера:

    array(1) {
      [11] =>
      string(27) "The parsed date was invalid"
    }
    

  8. Крайние случаи уже можно обработать, для этого необходимо использовать метод DateTimeImmutable::createFromFormat(), предоставляя правильный формат.

    <?php
    $res 
    DateTimeImmutable::createFromFormat("Y-m-d""2015-09-34");
    var_dump($res);

    Результат выполнения данного примера:

    class DateTime#1 (3) {
      public $date =>
      string(26) "2015-10-04 17:24:43.000000"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(13) "Europe/London"
    }
    

add a note

User Contributed Notes 1 note

up
21
Ray.Paseur sometimes uses Gmail
5 years ago
When you've got external inputs that do not strictly follow the formatting and disambiguation rules, you may still be able to use the static method ::createFromFormat() to create a usable DateTime object

<?php
/**
* Date values separated by slash are assumed to be in American order: m/d/y
* Date values separated by dash are assumed to be in European order: d-m-y
* Exact formats for date/time strings can be injected with ::createFromFormat()
*/
error_reporting(E_ALL);

// THIS IS INVALID, WOULD IMPLY MONTH == 19
$external = "19/10/2016 14:48:21";

// HOWEVER WE CAN INJECT THE FORMATTING WHEN WE DECODE THE DATE
$format = "d/m/Y H:i:s";
$dateobj = DateTime::createFromFormat($format, $external);

$iso_datetime = $dateobj->format(Datetime::ATOM);
echo
"SUCCESS: $external EQUALS ISO-8601 $iso_datetime";

// MAN PAGE: http://php.net/manual/en/datetime.createfromformat.php
To Top