PHP 8.1.24 Released!

Относительные форматы

На этой странице описаны относительные форматы даты/времени в BNF-подобном синтаксисе, которые понимает парсер функций: DateTimeImmutable, DateTime, date_create(), date_create_immutable() и strtotime().

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

Используемые символы
Описание Формат
dayname (наименование дня недели) 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
daytext (интервалы в неделях) 'weekday' | 'weekdays'
number [+-]?[0-9]+
ordinal (порядковые числительные и указатели) 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this'
reltext (указатели) 'next' | 'last' | 'previous' | 'this'
space (символы пробела и табуляции) [ \t]+
unit (интервалы) 'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond' | 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | daytext
Нотации, основанные на днях
Формат Описание Примеры
'yesterday' Полночь вчера "yesterday 14:00"
'midnight' Время устанавливается в 00:00:00  
'today' Время устанавливается в 00:00:00  
'now' Текущее время  
'noon' Время устанавливается в 12:00:00 "yesterday noon"
'tomorrow' Полночь завтра  
'back of' hour 15 минут заданного часа "back of 7pm", "back of 15"
'front of' hour Без 15 минут заданный час "front of 5am", "front of 23"
'first day of' Устанавливает первый день текущего месяца. Обычно эту нотацию лучше использовать вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц. "first day of January 2008"
'last day of' Устанавливает последний день текущего месяца. Обычно эту нотацию лучше использовать вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц. "last day of next month"
ordinal space dayname space 'of' Вычисляет x день недели текущего или заданного месяца. "first sat of July 2008"
'last' space dayname space 'of' Вычисляет последний день недели текущего или заданного месяца. "last sat of July 2008"
number space? (unit | 'week') Вычисляет относительное время при использовании числовых значений периода. "+5 weeks", "12 day", "-7 weekdays"
ordinal space unit Вычисляет относительное время при использовании строковых значений периода. "fifth day", "second month"
'ago' Вычитает все значения из последнего полученного момента времени. "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago"
dayname Перемещается на следующий день указанного дня недели. (Смотрите замечание) "Monday"
reltext space 'week' Разбирает специфичный формат "weekday + last/this/next week". "Monday next week"

Замечание:

Относительные выражения всегда обрабатываются после не являющихся относительными. Например, "+1 week july 2008" эквивалентно "july 2008 +1 week".

Исключением этого правила являются: "yesterday", "midnight", "today", "noon" и "tomorrow". Записи "tomorrow 11:00" и "11:00 tomorrow" отличаются. Если принять сегодняшнюю дату за "July 23rd, 2008", то первая запись возвращает "2008-07-24 11:00", а вторая "2008-07-24 00:00". Причина такого поведения в том, что эти пять выражений влияют непосредственно на время.

Такие ключевые слова, как "first day of", зависят от контекста, в котором используется строка относительного формата. Если она используется в статическом методе или функции, то референтом является текущая системная метка времени. Однако при использовании в методе DateTime::modify() или DateTimeImmutable::modify(), референтом является объект, на котором вызывается метод modify().

Замечание:

Следует обратить внимание на приведённые ниже замечания относительно текущего дня недели и дня недели, указанного в строке даты/времени. Текущий день недели может быть вычислен из независимой части строки даты/времени.

  1. "dayname" не сдвигает дату на другой день. (Например: "Wed July 23rd, 2008" означает "2008-07-23").
  2. "number dayname" не сдвигает дату на другой день. (Например: "1 wednesday july 23rd, 2008" означает "2008-07-23").
  3. "number week dayname" добавляет соответствующее число недель, но не сдвигает дату на другой день. В этом случае имеют место два различных блока "number week" и "dayname". (Например: "+1 week wednesday july 23rd, 2008" означает "2008-07-30").
  4. "ordinal dayname" сдвигает дату на другой день. (Например: "last wednesday july 23rd, 2008" означает "2008-07-30").
  5. "number week ordinal dayname" добавляет соответствующее число недель, а после сдвигает дату на другой день. В этом случае имеют место два различных блока "number week" и "ordinal dayname". (Например: "+1 week first wednesday july 23rd, 2008" означает "2008-08-06").
  6. "ordinal dayname 'of' " не сдвигает дату на другой день. (Например: "first wednesday of july 23rd, 2008" означает "2008-07-02", потому как определённые фразы с 'of' сбрасывают день месяца на '1' и в этом случае игнорируется '23rd').

Также следует обратить внимание, что "of" в "ordinal space dayname space 'of' " и "'last' space dayname space 'of' " имеет особый смысл.

  1. Устанавливает день месяца в 1.
  2. "ordinal dayname 'of' "не сдвигает дату на другой день. (Например: "first tuesday of july 2008" означает "2008-07-01").
  3. "ordinal dayname" сдвигает дату на другой день. (Например: "first tuesday july 2008" означает "2008-07-08", смотрите также 4-й пункт предыдущего замечания).
  4. "'last' dayname 'of' " получает последний в месяце dayname. (Например: "last wed of july 2008" означает "2008-07-30")
  5. "'last' dayname" получает последний dayname перед текущим днём. (Например: "last wed july 2008" означает "2008-06-25"; "july 2008" устанавливает дату в "2008-07-01", а после "last wed" смещает дату к предыдущей среде, а именно к "2008-06-25").

Замечание:

Относительные значения в месяцах рассчитываются исходя из их продолжительности. Например, из "+2 month 2011-11-30" получится "2012-01-30". Это связано с тем, что ноябрь состоит из 30 дней, а декабрь из 31 дня, что составляет 61 дней.

Замечание:

Под числом (number) подразумевается целое число (integer); Если будет указано десятичное число, то десятичная точка (или запятая) будет рассматриваться как разделитель. К примеру, '+1.5 hours' будет считаться как '+1 5 hours', а не '+1 hour +30 minutes'.

Список изменений

Версия Описание
8.2.0 Символы number больше не принимают несколько знаков, например, +-2.
7.0.8 Недели всегда начинаются с понедельника. Ранее можно было определять начало недели с воскресенья.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top