Вывод даты/времени в PHP
date - Форматирует вывод системной даты/времени
Относительные форматы ¶
На этой странице описаны относительные форматы даты/времени, которые понимает парсер функций: DateTimeImmutable, DateTime, date_create(), date_create_immutable() и strtotime().
Описание | Формат |
---|---|
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". Причина такого поведения в том, что эти пять выражений влияют непосредственно на время.
Такие ключевые слова, как "first day of", зависят от контекста, в котором используется строка относительного формата. Если она используется в статическом методе или функции, то референтом является текущая системная метка времени. Однако при использовании в методе DateTime::modify() или DateTimeImmutable::modify(), референтом является объект, на котором вызывается методmodify()
.
Замечание:
Следует обратить внимание на приведённые ниже замечания относительно текущего дня недели и дня недели, указанного в строке даты/времени. Текущий день недели может быть вычислен из независимой части строки даты/времени.
- "
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'
.
Список изменений
Версия | Описание |
---|---|
7.0.8 | Недели всегда начинаются с понедельника. Ранее можно было определять начало недели с воскресенья. |
add a note
User Contributed Notes 13 notes
updown 47
Mark Simon ¶
6 years agoote that expressions such as “last day of” and “first day of” imply a day of a month, not, for example of the year or week.
So, expressions, such as “first day of this year” will give the first day of this month, with no apparent regard for the year.
As powerful as the parser is, it can lead to disappointing or confusing results.
updown23
Igor ¶
4 years ago@Mark Simon, while you're correct, it's still possible to get first/last day of the year using relative date formats, though in a somewhat roundabout way.
<?php
echo gmdate('F j, Y', strtotime('first day of january this year'));;
/* Output: January 1, 2018 */
echo gmdate('F j, Y', strtotime('last day of december this year'));;
/* Output: December 31, 2018 */
?>
updown19
oguzkonya34 at gmail dot com ¶
10 years agoApril 1st, 2012 is Sunday. You might expect to get April 2nd, 2012 with 'Monday next week', however this:
<?php
echo date('F jS, Y', strtotime('Monday next week 2012-04-01'));
?>
returns April 9th, 2012. To get April 2nd, you need to use this:
<?php
echo date('F jS, Y', strtotime('next Monday 2012-04-01'));
?>
Apparently 'next week' advances the week if and only if the day is Sunday. This:
<?php
echo date('F jS, Y', strtotime('Monday next week 2012-03-31'));
?>
would still return April 2nd.
updown2InvisibleSmiley ¶
1 year agoBoth dayname AND daytext ("weekday"/"weekdays") reset time information to 0.
Depending on how accurate you need it, the following may work for you:
new DateTime('last weekday ' . date('H:i:s'));
new DateTime('last weekday ' . (new DateTime())->format('H:i:s.u'));
(As documented, date() doesn't handle microseconds.)
updown5
phpnet at rudde dot org ¶
6 years agoGet the first day of a month, in a typical calendar month, typically the Monday in the first week of the month. In my example when the code is ran at 2016-04-06, 1st of april will be a Friday, since Calendars typically start on monday, this is the date you might want, in this case this would be 28th of March.
<?php
/* Code ran at 2016-04-06 */
$date = new DateTime('first day of this month');
$date->modify('monday this week');
echo $date->format('Y-m-d');
/* Output: 2016-03-28 */
?>
updown10
geneticdrift ¶
11 years agoMonth skipping has issues with number of days in the month.
'+1 month' may move to the following month if the next month has less days than the current:
<?php print date('d M Y H:i:s', strtotime('+1 month', strtotime('Thu Mar 31 19:50:41 IST 2011'))); ?>
Prints: 01 May 2011 19:50:41
But with 'last day of +1 month' the result is different:
<?php print date('d M Y H:i:s', strtotime('last day of +1 month', strtotime('Thu Mar 31 19:50:41 IST 2011'))); ?>
Prints: 30 Apr 2011 19:50:41
(PHP 5.3.3)
updown5chris at burnhamup dot com ¶9 years agoUsing strtotime('DAYNAME') like strtotime('Tuesday') returns midnight on the specified day. It doesn't preserve the current time or the time passed into the function.
updown0yaroslav429 at gmail dot com ¶1 year ago@Igor, @Mark Simon, seems that was fixed.
PHP 7.4.10
<?php
new DateTimeImmutable('midnight first day of');
/* date: 2020-09-01 00:00:00.0 UTC (+00:00) */
new DateTimeImmutable('midnight first day of next month next year');
/* date: 2021-10-01 00:00:00.0 UTC (+00:00) */
?>
updown0php at rcs dot us ¶5 years agoI'm not sure if this is a bug or expected. As erwin points out :
"first monday of may 2011" is invalid, but "first monday may 2011" does work. Simply omit "of" if above examples do not work.
This still applies in 5.5 as well, and I ran into it while building out a utility to check if a day was a holiday.
Meaning "fourth day July 2016" /works/, but "fourth day of July 2016" does not. It will return an error. I emphasize works, because "fourth day July 2016" actually returns 2016-07-05. So you'll need "third day July 2016" for the Fourth of July.
However, "Last Monday May 2016" and "Last Monday of May 2016" ( for Memorial Day ) are both /valid/, but produce different results. The first returns 2016-04-25, which is incorrect, while the second returns the correct 2016-05-30.
updown-1matt ¶10 years agoIf the ordinal being used is "last" and the next month is n, use the "n 1". Otherwise, if the previous month is p and it has d number of days in it, use "p d".
For example: "last thursday of November" becomes "last thursday December 1" and "fourth thursday of November" becomes "fourth thursday September 30th"
Hopes this helps someone out there.
updown-16Pseudoname ¶7 years agooguzkonya34 at gmail dot com
Point of correction:
Apparently 'next week' advances the week if and only if the day is Sunday. This:
<?php
echo date('F jS, Y', strtotime('Monday next week 2012-03-31'));
?>
would still return April 2nd.
Quote "
Apparently 'next week' advances the week if and only if the day is Sunday. "
Not really. 2012-03-31 would be Saturday if 2012-04-01 is Sunday as you mentioned. Then Monday next week for 2012-03-31 is April 2nd which is correct.
updown-21scragar at gmail dot com ¶10 years agoJust for those who want the last day of the year without calling the function twice:
<?php
echo date('Y-m-d',
strToTime('1/1 next year -1 day')
);
// 2011-12-31
?>
For reference this is actually saying "Take the first day of the first month next year, then subtract 1 day".
updown-5mike ¶1 year agoin case of somone wonder 'last day of 1 month ago' is also posible (not only month names)
Вернуться к: Функции даты и времени
date
(PHP 4, PHP 5, PHP 7)
date — Форматирует вывод системной даты/времени
Пример для кода:
$localtime = new DateTime();
$paid_normal = $localtime->format('Y-m-d H:i:s:u');
Описание
string date ( string $format
[, int $timestamp
= time() ] )
Возвращает строку, отформатированную в соответствии с указанным шаблоном format
. Используется метка времени, заданная аргументом timestamp
, или текущее системное время, если timestamp
не задан. Таким образом, timestamp
является необязательным и по умолчанию равен значению, возвращаемому функцией time().
Список параметров
format
Шаблон результирующей строки (string) с датой. См. параметры форматирования ниже. Также существует несколько предопределенных констант даты/времени, которые могут быть использованы вместо этих параметров. Например: DATE_RSS
заменяет шаблон 'D, d M Y H:i:s'.
Символ в строке format | Описание | Пример возвращаемого значения |
---|---|---|
День | --- | --- |
d | День месяца, 2 цифры с ведущим нулём | от 01 до 31 |
D | Текстовое представление дня недели, 3 символа | от Mon до Sun |
j | День месяца без ведущего нуля | от 1 до 31 |
l (строчная 'L') | Полное наименование дня недели | от Sunday до Saturday |
N | Порядковый номер дня недели в соответствии со стандартом ISO-8601 (добавлен в версии PHP 5.1.0) | от 1 (понедельник) до 7 (воскресенье) |
S | Английский суффикс порядкового числительного дня месяца, 2 символа | st, nd, rd или th. Применяется совместно с j |
w | Порядковый номер дня недели | от 0 (воскресенье) до 6 (суббота) |
z | Порядковый номер дня в году (начиная с 0) | От 0 до 365 |
Неделя | --- | --- |
W | Порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника (добавлено в версии PHP 4.1.0) | Например: 42 (42-я неделя года) |
Месяц | --- | --- |
F | Полное наименование месяца, например January или March | от January до December |
m | Порядковый номер месяца с ведущим нулём | от 01 до 12 |
M | Сокращенное наименование месяца, 3 символа | от Jan до Dec |
n | Порядковый номер месяца без ведущего нуля | от 1 до 12 |
t | Количество дней в указанном месяце | от 28 до 31 |
Год | --- | --- |
L | Признак високосного года | 1, если год високосный, иначе 0. |
o | Номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. (добавлен в версии PHP 5.1.0) | Примеры: 1999 или 2003 |
Y | Порядковый номер года, 4 цифры | Примеры: 1999, 2003 |
y | Номер года, 2 цифры | Примеры: 99, 03 |
Время | --- | --- |
a | Ante meridiem (англ. "до полудня") или Post meridiem (англ. "после полудня") в нижнем регистре | am или pm |
A | Ante meridiem или Post meridiem в верхнем регистре | AM или PM |
B | Время в формате Интернет-времени (альтернативной системы отсчета времени суток) | от 000 до 999 |
g | Часы в 12-часовом формате без ведущего нуля | от 1 до 12 |
G | Часы в 24-часовом формате без ведущего нуля | от 0 до 23 |
h | Часы в 12-часовом формате с ведущим нулём | от 01 до 12 |
H | Часы в 24-часовом формате с ведущим нулём | от 00 до 23 |
i | Минуты с ведущим нулём | от 00 до 59 |
s | Секунды с ведущим нулём | от 00 до 59 |
u | Микросекунды (добавлено в версии PHP 5.2.2). Учтите, что date() всегда будет возвращать 000000, т.к. она принимает целочисленный (integer) параметр, тогда как DateTime::format() поддерживает микросекунды. | Например: 654321 |
Временная зона | --- | --- |
e | Код шкалы временной зоны(добавлен в версии PHP 5.1.0) | Примеры: UTC, GMT, Atlantic/Azores |
I (заглавная i) | Признак летнего времени | 1, если дата соответствует летнему времени, 0 в противном случае. |
O | Разница с временем по Гринвичу, в часах | Например: +0200 |
P | Разница с временем по Гринвичу с двоеточием между часами и минутами (добавлено в версии PHP 5.1.3) | Например: +02:00 |
T | Аббревиатура временной зоны | Примеры: EST, MDT ... |
Z | Смещение временной зоны в секундах. Для временных зон, расположенных западнее UTC возвращаются отрицательные числа, а расположенных восточнее UTC - положительные. | от -43200 до 50400 |
Полная дата/время | --- | --- |
c | Дата в формате стандарта ISO 8601 (добавлено в PHP 5) | 2004-02-12T15:19:21+00:00 |
r | Дата в формате » RFC 2822 | Например: Thu, 21 Dec 2000 16:01:07 +0200 |
U | Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT) | Смотрите также time() |
Любые другие символы, встреченные в строке-шаблоне, будут выведены в результирующую строку без изменений. Z всегда возвращает 0 при использовании gmdate().
Замечание:
Поскольку рассматриваемая функция принимает в качестве параметра временные метки типа integer, форматирующий символ u будет полезен только при использовании функции date_format() и пользовательских меток времени, созданных с помощью функции date_create().timestamp
Необязательный параметр timestamp
представляет собой integer метку времени, по умолчанию равную текущему локальному времени, если timestamp
не указан. Другими словами, значение по умолчанию равно результату функции time().
Возвращаемые значения
Возвращает отформатированную строку с датой. При передаче нечислового значения в качестве параметра timestamp
будет возвращено FALSE
и вызвана ошибка уровня E_WARNING
.
Ошибки
Каждый вызов к функциям даты/времени при неправильных настройках временной зоны сгенерирует ошибку уровня E_NOTICE
, и/или ошибку уровня E_STRICT
или E_WARNING
при использовании системных настроек или переменной окружения TZ. Смотрите также date_default_timezone_set()
Список изменений
Версия | Описание |
---|---|
5.1.0 | Допустимым диапазоном дат для временных меток обычно являются даты с 13 декабря 1901, 20:45:54 GMT по 19 января 2038, 03:14:07 GMT. (Они соответствуют минимальному и максимальному значению 32-битного целого числа со знаком). Однако для PHP версии ниже 5.1.0 в некоторых операционных системах (например, Windows) этот диапазон был ограничен датами 01-01-1970 до 19-01-2038. |
5.1.0 | Теперь ошибки, связанные с временными зонами, генерируют ошибки уровня |
5.1.1 | Для стандартных форматов даты/времени существуют специальные константы, которые могут быть указаны в качестве параметра format . |
Примеры
Пример #1 Примеры использования функции date()<?php
// установка временной зоны по умолчанию. Доступно начиная с версии PHP 5.1
date_default_timezone_set('UTC');
// выведет примерно следующее: Monday
echo date("l");
// выведет примерно следующее: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
// выведет: July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* пример использования константы в качестве форматирующего параметра */
// выведет примерно следующее: Wed, 25 Sep 2013 15:28:57 -0700
echo date(DATE_RFC2822);
// выведет примерно следующее: 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
Чтобы запретить распознавание символа как форматирующего, следует экранировать его с помощью обратного слеша. Если экранированный символ также является форматирующей последовательностью, то следует экранировать его повторно.
Пример #2 Экранирование символов в функции date()<?php
// выведет примерно следующее: Wednesday the 15th
echo date('l \t\h\e jS');
?>
Для вывода прошедших и будущих дат удобно использовать функции date() и mktime().
Пример #3 Пример совместного использования функций date() и mktime()<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Замечание:
Данный способ более надежен, чем простое вычитание и прибавление секунд к метке времени, поскольку позволяет при необходимости гибко осуществить переход на летнее/зимнее время.
Ещё несколько примеров использования функции date(). Важно отметить, что следует экранировать все символы, которые необходимо оставить без изменений. Это справедливо и для тех символов, которые в текущей версии PHP не распознаются как форматирующие, поскольку это может быть введено в следующих версиях. Для экранировании управляющих последовательностей (например, \n) следует использовать одинарные кавычки.
Пример #4 Форматирование с использованием date()<?php
// Предположим, что текущей датой является 10 марта 2001, 5:16:18 вечера,
// и мы находимся во временной зоне Mountain Standard Time (MST)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // it is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:18 m is month
$today = date("H:i:s"); // 17:16:18
$today = date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (формат MySQL DATETIME)
?>
Для форматирования дат на других языках используйте вместо date() функции setlocale() и strftime().
DateTime::format - Возвращает дату, отформатированную согласно переданному формату
DateTime::format
DateTimeImmutable::format
DateTimeInterface::format
date_format
(PHP 5 >= 5.2.0, PHP 7)
DateTime::format -- DateTimeImmutable::format -- DateTimeInterface::format -- date_format — Возвращает дату, отформатированную согласно переданному формату
Описание
Объектно-ориентированный стильpublic string DateTime::format ( string $format
)public string DateTimeImmutable::format ( string $format
)public string DateTimeInterface::format ( string $format
)
Процедурный стильstring date_format ( DateTimeInterface $object
, string $format
)
Возвращает дату, отформатированную согласно переданному формату.
Список параметровobject
Только для процедурного стиля: Объект DateTime, возвращаемый date_create()format
Формат, принимаемый функцией date().
Возвращаемые значения
Возвращает строку с отформатированной датой в случае успеха или FALSE
в случае возникновения ошибки.
Примеры
Пример #1 Пример использования DateTime::format()
Объектно-ориентированный стиль<?php
$date = new DateTime('2000-01-01');
echo $date->format('Y-m-d H:i:s');
?>
Процедурный стиль<?php
$date = date_create('2000-01-01');
echo date_format($date, 'Y-m-d H:i:s');
?>
Результат выполнения данного примера:2000-01-01 00:00:00
Примечания
Замечание:
Для получения метки времени из строкового представления даты можно воспользоваться функцией strtotime(). Кроме того, некоторые базы данных имеют собственные функции для преобразования внутреннего представления даты в метку времени (например, функция MySQL » UNIX_TIMESTAMP).
Подсказка
Начиная с версии PHP 5.1, временную метку начала запроса можно получить из поля $_SERVER['REQUEST_TIME'].
Смотрите также
- gmdate() - Форматирует дату/время по Гринвичу
- idate() - Преобразует локальное время/дату в целое число
- getdate() - Возвращает информацию о дате/времени
- getlastmod() - Определение времени последней модификации страницы
- mktime() - Возвращает метку времени Unix для заданной даты
- strftime() - Форматирует текущую дату/время с учетом текущих настроек локали
- time() - Возвращает текущую метку времени Unix
- strtotime() - Преобразует текстовое представление даты на английском языке в метку времени Unix
- Предопределенные константы даты и времени
Источник:
date - Форматирует вывод системной даты/времени
PHP DateTime: Create, Compare and Format Dates Easily