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

Содержание

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

Чтобы отформатировать объекты DateTimeImmutable и DateTime, обратитесь к документации метода DateTimeInterface::format().

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

  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);

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

    object(DateTimeImmutable)#1 (3) {
      ["date"]=>
      string(26) "2015-10-04 17:24:43.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/London"
    }
    

add a note add a note

User Contributed Notes 1 note

up
21
Ray.Paseur sometimes uses Gmail
6 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