Относительные форматы
На этой странице описаны относительные форматы даты/времени, которые понимает парсер функций strtotime(), DateTime и date_create().
Описание | Формат |
---|---|
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 (интервалы) |
(('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". Причина такого поведения в том, что эти пять выражений влияют непосредственно на время.
Замечание:
Следует обратить внимание на приведенные ниже замечания относительно текущего дня недели и дня недели, указанного в строке даты/времени. Текущий день недели может быть вычислен из независимой части строки даты/времени.
- "
dayname
" не сдвигает дату на другой день. (Например: "Wed July 23rd, 2008" означает "2008-07-23").- "
number
dayname
" не сдвигает дату на другой день. (Например: "1 wednesday july 23rd, 2008" означает "2008-07-23").- "
number
weekdayname
" добавляет соответствующее число недель, но не сдвигает дату на другой день. В этом случае имеют место два различных блока "number
week" и "dayname
". (Например: "+1 week wednesday july 23rd, 2008" означает "2008-07-30").- "
ordinal
dayname
" сдвигает дату на другой день. (Например: "last wednesday july 23rd, 2008" означает "2008-07-30").- "
number
weekordinal
dayname
" добавляет соответствующее число недель, а после сдвигает дату на другой день. В этом случае имеют место два различных блока "number
week" и "ordinal
dayname
". (Например: "+1 week first wednesday july 23rd, 2008" означает "2008-08-06").- "
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.
- "
ordinal
dayname
'of' "не сдвигает дату на другой день. (Например: "first tuesday of july 2008" означает "2008-07-01").- "
ordinal
dayname
" сдвигает дату на другой день. (Например: "first tuesday july 2008" означает "2008-07-08", см. также 4-й пункт предыдущего замечания).- "'last'
dayname
'of' " получает последний в месяцеdayname
. (Например: "last wed of july 2008" означает "2008-07-30")- "'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'
.
Список изменений
Версия | Описание |
---|---|
5.6.23, 7.0.8 | Недели всегда начинаются с понедельника. Ранее можно было определять начало недели с воскресенья. |
5.3.3 | Поведение "first day" и "last day" изменено на "+1 day" and "-1 day", соответственно. Ранее поведение было равносильно "first day of" и "last day of". |