PHP 8.1.31 Released!

strftime

(PHP 4, PHP 5, PHP 7, PHP 8)

strftimeФорматирует местную дату и время с учётом региональных настроек

Внимание

Функция УСТАРЕЛА с PHP 8.1.0. Полагаться на функцию настоятельно не рекомендуют.

Разработчикам доступны следующие альтернативы:

Описание

strftime(string $format, ?int $timestamp = null): string|false

Функция форматирует дату и время с учётом локали. Названия месяцев и дней недели, а также другие строки, которые зависят от языка, будут соответствовать текущим языковым настройкам, которые установили функцией setlocale().

Внимание

Текущая библиотека языка C не всегда поддерживает каждый спецификатор преобразования, и тогда функция strftime() тоже не будет поддерживать каждый спецификатор. Кроме того, не каждая платформа поддерживает отрицательные метки времени, поэтому диапазон дат иногда ограничивается эпохой Unix. Это означает, что спецификаторы %e, %T, %R и %D (и, возможно, другие), как и даты до 1 января 1970, не поддерживаются ОС Windows, отдельными версиями систем Linux и рядом других операционных системам. Список спецификаторов преобразования для Windows-систем даёт страница » на сайте MSDN. Вместо этой функции вызывают метод IntlDateFormatter::format().

Список параметров

format

Строка параметра format распознаёт следующие символы
Параметр format Описание Пример возвращаемых значений
День --- ---
%a Сокращённое название дня недели От Sun до Sat
%A Полное название дня недели От Sunday до Saturday
%d Двузначный день месяца с ведущим нулём От 01 до 31
%e День месяца с пробелом перед одиночными цифрами. В ОС Windows обработку модификатора реализовали иначе, чем описывает руководство. Дополнительную информацию дают следующие параграфы. От 1 до 31
%j День года, 3 цифры с ведущими нулями От 001 до 366
%u Числовое представление дня недели по правилам стандарта ISO-8601 От 1 (понедельник) до 7 (воскресенье)
%w Числовое представление дня недели От 0 (воскресенье) до 6 (суббота)
Неделя --- ---
%U Двузначный номер недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого воскресенья, которое играет роль первого дня недели 13 (для 13-й полной недели года)
%V Номер недели года по правилам стандарта ISO-8601:1988, счёт начинается с недели, которая содержит не меньше 4 дней, неделя начинается с понедельника От 01 до 53 (где 53 соответствует перекрывающейся неделе)
%W Двузначное числовое представление недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого понедельника года, который играет роль первого дня недели 46 (для 46-й недели года, которая начинается с понедельника)
Месяц --- ---
%b Сокращённое название месяца на основе локали От Jan до Dec
%B Полное название месяца на основе локали От January до December
%h Сокращённое название месяца на основе локали (псевдоним модификатора %b) От Jan до Dec
%m Числовое представление месяца с ведущим нулём перед одиночными цифрами От 01 для января до 12 для декабря
Год --- ---
%C Двузначное представление столетия (год, разделённый на 100 и усечённый до целого числа) 19 для 20-го века
%g Двузначное представление года по правилам стандарта ISO-8601:1988 (смотрите описание модификатора %V) Пример: 09 для недели, в которую входит 6 января 2009
%G Полная 4-значная версия представления модификатора %g Пример: 2009 для недели, в которую входит 3 января 2009
%y Двузначное представление года Пример: 09 для 2009, 79 для 1979
%Y Четырёхзначное представление года Пример: 2038
Время --- ---
%H Двузначное представление часа в 24-часовом формате От 00 до 23
%k Двузначное представление часа в 24-часовом формате с пробелом перед одиночной цифрой От 0 до 23
%I Двузначное представление часа в 12-часовом формате От 01 до 12
%l (строчная L) Час в 12-часовом формате с пробелом перед одиночной цифрой От 1 до 12
%M Двузначное представление минуты От 00 до 59
%p Обозначение первой или второй половины дня в верхнем регистре на основе времени, «AM» — до полудня или «PM» после полудня. Пример: AM для 00:31, PM для 22:23. Точный результат зависит от операционной системы, которые иногда возвращают варианты в нижнем регистре или варианты с точками (например, a.m.)
%P Обозначение первой или второй половины дня в нижнем регистре на основе времени, «am» — до полудня или «pm» после полудня. Пример: am для 00:31, pm для 22:23. Поддерживается не каждой операционной системой
%r То же, что и "%I:%M:%S %p" Пример: 09:34:17 PM для 21:34:17
%R То же, что и "%H:%M" Пример: 00:35 для 12:35 AM, 16:44 для 4:44 PM
%S Двузначное представление секунды От 00 до 59
%T То же, что и "%H:%M:%S" Пример: 21:34:17 для 09:34:17 PM
%X Предпочтительное представление времени на основе локали, без даты Пример: 03:59:16 или 15:59:16
%z Смещение часового пояса относительно стандарта UTC. В ОС Windows обработку модификатора реализовали иначе, чем описывает руководство. Дополнительную информацию дают следующие параграфы. Пример: -0500 для US Eastern Time
%Z Аббревиатура часового пояса. В ОС Windows обработку модификатора реализовали иначе, чем описывает руководство. Дополнительную информацию дают следующие параграфы. Пример: EST для Eastern Time
Метки даты и времени --- ---
%c Предпочтительная метка даты и времени на основе локали Пример: Tue Feb 5 00:45:10 2009 для 5 февраля 2009 00:45:10
%D То же, что и "%m/%d/%y" Пример: 02/05/09 для 5 февраля 2009
%F То же, что и "%Y-%m-%d" (таким форматом часто пользуются в метках дат баз данных) Пример: 2009-02-05 для 5 февраля 2009
%s Метка времени эпохи Unix (то же, что и функция time()) Пример: 305815200 для 10 сентября 1979 08:40:00
%x Предпочтительное представление даты на основе локали, без времени Пример: 02/05/09 для 5 февраля 2009
Прочее --- ---
%n Символ перевода строки («\n») ---
%t Символ табуляции («\t») ---
%% Символ процента («%») ---

Внимание

Вопреки стандарту ISO-9899:1999, в ОС Sun Solaris отсчёт числового представления дня недели начинается с воскресенья. Поэтому модификатор %u иногда работает не так, как описывает руководство.

Внимание

Только для Windows:

Модификатор %e не поддерживается в Windows-реализации функции. Значение получают через модификатор %#d. Пример на этой странице показывает, как написать совместимую кросс-платформенную функцию.

Модификаторы %z и %Z возвращают название часового пояса вместо смещения или аббревиатуры.

Внимание

Только для macOS и стандартной библиотеки musl языка C: модификатор %P не поддерживается в реализации этой функции в macOS.

timestamp

Необязательный параметр timestamp — целочисленная (int) метка времени, которая по умолчанию равна текущему местному времени, если параметр timestamp не указали или равен null. Говоря по другому, значение по умолчанию равно результату функции time().

Возвращаемые значения

Функция возвращает строковое представление метки времени timestamp или местного времени, если метку не указали, которые отформатировала по условиям параметра format. Названия месяцев и дней недели, а также другие строки, которые зависят от языка, будут соответствовать текущей локали, которую установили функцией setlocale(). Функция возвращает false, если параметр format пуст, содержит неподдерживаемые спецификаторы преобразования или если длина возвращаемой строки превысит значение 4095.

Ошибки

Каждый вызов функции для работы с датой и временем генерирует ошибку уровня E_WARNING при неправильных настройках часового пояса. Смотрите также описание функции date_default_timezone_set().

Поскольку вывод зависит от текущей библиотеки языка C, отдельные спецификаторы преобразования поддерживаются не всегда. В ОС Windows функция выдаст 5 сообщений об ошибках уровня E_WARNING и вернёт false при передаче неизвестных спецификаторов преобразования. В других операционных системах функция не всегда выдаёт сообщения об ошибках уровня E_WARNING, а вывод иногда содержит модификаторы без преобразования.

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

Версия Описание
8.0.0 Параметр timestamp теперь принимает значение null.

Примеры

Этот пример будет работать в системах с языковыми настройками, которые соответствуют модификаторам.

Пример #1 Пример использования функции strftime() с разными языковыми настройками

<?php

setlocale
(LC_TIME, "C");
echo
strftime("%A");

setlocale(LC_TIME, "fi_FI");
echo
strftime(" по-фински — %A,");

setlocale(LC_TIME, "fr_FR");
echo
strftime(" по-французски — %A и");

setlocale(LC_TIME, "de_DE");
echo
strftime(" по-немецки — %A.\n");

?>

Пример #2 Пример номеров недели по стандарту ISO 8601:1988

<?php

/* Декабрь 2002 / Январь 2003
ISOнед Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */

// Вывод: Дата 12/28/2002 в формате %V, %G, %Y = 52,2002,2002
echo "Дата 12/28/2002 в формате %V, %G, %Y = " . strftime("%V, %G, %Y", strtotime("12/28/2002")) . "\n";

// Вывод: Дата 12/30/2002 в формате %V, %G, %Y = 1,2003,2002
echo "Дата 12/30/2002 в формате %V, %G, %Y = " . strftime("%V, %G, %Y", strtotime("12/30/2002")) . "\n";

// Вывод: Дата 1/3/2003 в формате %V, %G, %Y = 1,2003,2003
echo "Дата1/3/2003 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("1/3/2003")) . "\n";

// Вывод: Дата 1/10/2003 в формате %V, %G, %Y = 2,2003,2003
echo "Дата1/10/2003 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("1/10/2003")) . "\n";


/* Декабрь 2004 / Январь 2005
ISOнед Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */

// Вывод: Дата 12/23/2004 в формате %V, %G, %Y = 52,2004,2004
echo "Дата 12/23/2004 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("12/23/2004")) . "\n";

// Вывод: Дата 12/31/2004 в формате %V,%G,%Y = 53,2004,2004
echo "Дата 12/31/2004 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("12/31/2004")) . "\n";

// Вывод: Дата 1/2/2005 в формате %V, %G, %Y = 53,2004,2005
echo "Дата 1/2/2005 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("1/2/2005")) . "\n";

// Вывод: Дата 1/3/2005 в формате %V, %G, %Y = 1,2005,2005
echo "Дата 1/3/2005 в формате %V, %G, %Y = " . strftime("%V, %G, %Y",strtotime("1/3/2005")) . "\n";

?>

Пример #3 Пример кросс-платформенной совместимости модификатора %e

<?php

// 1 января: выдаёт результат: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';

// Убедимся, что код выполняется в ОС Windows, и правильно заменим модификатор %e
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}

echo
strftime($format);

?>

Пример #4 Отображение каждого известного и неизвестного формата

<?php

// Описание форматов
$strftimeFormats = array(
'A' => 'Полное название дня недели',
'B' => 'Полное название месяца на основе локали',
'C' => 'Двузначное представление столетия (год, разделённый на 100 и усечённый до целого числа)',
'D' => 'То же, что и "%m/%d/%y"',
'E' => '',
'F' => 'То же, что и "%Y-%m-%d"',
'G' => 'Полная 4-значная версия модификатора %g',
'H' => 'Двузначное представление часа в 24-часовом формате',
'I' => 'Двузначное представление часа в 12-часовом формате',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Двузначное представление минуты',
'N' => '',
'O' => '',
'P' => 'Обозначение «am» или «pm» в нижнем регистре на основе времени',
'Q' => '',
'R' => 'То же, что и "%H:%M"',
'S' => 'Двузначное представление секунды',
'T' => 'То же, что и "%H:%M:%S"',
'U' => 'Двузначный номер недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого воскресенья, которое играет роль первого дня недели',
'V' => 'Номер недели года по правилам стандарта ISO-8601:1988, счёт начинается с недели, которая содержит не меньше 4 дней, неделя начинается с понедельника',
'W' => 'Двузначное числовое представление недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого понедельника года, который играет роль первого дня недели',
'X' => 'Предпочтительное представление времени на основе локали, без даты',
'Y' => 'Четырёхзначное представление года',
'Z' => 'Смещение или аббревиатура часового пояса, которые НЕ выдаёт модификатор %z (зависит от операционной системы)',
'a' => 'Сокращённое название дня недели',
'b' => 'Сокращённое название месяца на основе локали',
'c' => 'Предпочтительная метка даты и времени на основе локали',
'd' => 'Двузначный день месяца с ведущим нулём',
'e' => 'День месяца с пробелом перед одиночными цифрами',
'f' => '',
'g' => 'Двузначное представление года по правилам стандарта ISO-8601:1988 (смотрите описание модификатора %V)',
'h' => 'Сокращённое название месяца на основе локали (псевдоним модификатора %b)',
'i' => '',
'j' => 'День года, 3 цифры с ведущими нулями',
'k' => 'Двузначное представление часа в 24-часовом формате с пробелом перед одиночной цифрой',
'l' => 'Час в 12-часовом формате с пробелом перед одиночной цифрой',
'm' => 'Числовое представление месяца с ведущим нулём перед одиночными цифрами',
'n' => 'Символ новой строки («\n»)',
'o' => '',
'p' => 'Обозначение "AM" или "PM" в верхнем регистре на основе времени',
'q' => '',
'r' => 'То же, что и "%I:%M:%S %p"',
's' => 'Метка времени эпохи Unix',
't' => 'Символ табуляции («\t»)',
'u' => 'Числовое представление дня недели по правилам стандарта ISO-8601',
'v' => '',
'w' => 'Числовое представление дня недели',
'x' => 'Предпочтительное представление даты на основе локали, без времени',
'y' => 'Двузначное представление года',
'z' => 'Смещение или аббревиатура часового пояса относительно стандарта UTC (зависит от операционной системы)',
'%' => 'Символ процента («%»)',
);

// Результаты
$strftimeValues = array();

// Обрабатываем форматы и подавляем ошибки
foreach ($strftimeFormats as $format => $description) {
if (
false !== ($value = @strftime("%{$format}"))) {
$strftimeValues[$format] = $value;
}
}

// Находим самое длинное значение
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));

// Отображаем известные форматы
foreach ($strftimeValues as $format => $value) {
echo
"Известный формат : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}

// Отображаем неизвестные форматы
foreach (array_diff_key($strftimeFormats, $strftimeValues) as $format => $description) {
echo
"Неизвестный формат : '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}

?>

Вывод приведённого примера будет похож на:

Известный формат   : 'A' = 'Friday'            ( Полное название дня недели )
Известный формат   : 'B' = 'December'          ( Полное название месяца на основе локали )
Известный формат   : 'H' = '11'                ( Двузначное представление часа в 24-часовом формате )
Известный формат   : 'I' = '11'                ( Двузначное представление часа в 12-часовом формате )
Известный формат   : 'M' = '24'                ( Двузначное представление минуты )
Известный формат   : 'S' = '44'                ( Двузначное представление секунды )
Известный формат   : 'U' = '48'                ( Двузначный номер недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого воскресенья, которое играет роль первого дня недели )
Известный формат   : 'W' = '48'                ( Двузначное числовое представление недели года с ведущим нулём для одиночных чисел. Отсчёт недель начинается с первого понедельника года, который играет роль первого дня недели )
Известный формат   : 'X' = '11:24:44'          ( Предпочтительное представление времени на основе локали, без даты )
Известный формат   : 'Y' = '2010'              ( Четырёхзначное представление года )
Известный формат   : 'Z' = 'GMT Standard Time' ( Смещение или аббревиатура часового пояса, которые НЕ выдаёт модификатор %z (зависит от операционной системы) )
Известный формат   : 'a' = 'Fri'               ( Сокращённое название дня недели )
Известный формат   : 'b' = 'Dec'               ( Сокращённое название месяца на основе локали )
Известный формат   : 'c' = '12/03/10 11:24:44' ( Предпочтительная метка даты и времени на основе локали )
Известный формат   : 'd' = '03'                ( Двузначный номер дня месяца (с ведущим нулём) )
Известный формат   : 'j' = '337'               ( Номер дня в году, 3 цифры с ведущими нулями )
Известный формат   : 'm' = '12'                ( Числовое представление месяца с ведущим нулём перед одиночными цифрами )
Известный формат   : 'p' = 'AM'                ( Обозначение «AM» или «PM» в верхнем регистре на основе времени )
Известный формат   : 'w' = '5'                 ( Числовое представление дня недели )
Известный формат   : 'x' = '12/03/10'          ( Предпочтительное представление даты на основе локали, без времени )
Известный формат   : 'y' = '10'                ( Двузначное представление года )
Известный формат   : 'z' = 'GMT Standard Time' ( Смещение или аббревиатура часового пояса относительно стандарта UTC (зависит от операционной системы) )
Известный формат   : '%' = '%'                 ( Символ процента ("%") )
Неизвестный формат : 'C'                       ( Двузначное представление столетия (год, разделённый на 100 и усечённый до целого числа) )
Неизвестный формат : 'D'                       ( То же, что и "%m/%d/%y" )
Неизвестный формат : 'E'
Неизвестный формат : 'F'                       ( То же, что и "%Y-%m-%d" )
Неизвестный формат : 'G'                       ( Полная 4-значная версия модификатора %g )
Неизвестный формат : 'J'
Неизвестный формат : 'K'
Неизвестный формат : 'L'
Неизвестный формат : 'N'
Неизвестный формат : 'O'
Неизвестный формат : 'P'                       ( Обозначение «am» или «pm» в нижнем регистре на основе времени )
Неизвестный формат : 'Q'
Неизвестный формат : 'R'                       ( То же, что и "%H:%M" )
Неизвестный формат : 'T'                       ( То же, что и "%H:%M:%S" )
Неизвестный формат : 'V'                       ( Номер недели года по правилам стандарта ISO-8601:1988, счёт начинается с недели, которая содержит не меньше 4 дней, неделя начинается с понедельника )
Неизвестный формат : 'e'                       ( День месяца с пробелом перед одиночными цифрами )
Неизвестный формат : 'f'
Неизвестный формат : 'g'                       ( Двузначное представление года по правилам стандарта ISO-8601:1988 (смотрите описание модификатора %V) )
Неизвестный формат : 'h'                       ( Сокращённое название месяца на основе локали (псевдоним модификатора %b) )
Неизвестный формат : 'i'
Неизвестный формат : 'k'                       ( Двузначное представление часа в 24-часовом формате с пробелом перед одиночной цифрой )
Неизвестный формат : 'l'                       ( Час в 12-часовом формате с пробелом перед одиночной цифрой )
Неизвестный формат : 'n'                       ( Символ новой строки («\n») )
Неизвестный формат : 'o'
Неизвестный формат : 'q'
Неизвестный формат : 'r'                       ( То же, что и "%I:%M:%S %p" )
Неизвестный формат : 's'                       ( Временная метка эпохи Unix )
Неизвестный формат : 't'                       ( Символ табуляции («\t») )
Неизвестный формат : 'u'                       ( Числовое представление дня недели по правилам стандарта ISO-8601 )
Неизвестный формат : 'v'

Примечания

Замечание: Модификаторы %G и %V, работа которых основана на днях недели по стандарту ISO 8601:1988, иногда дают неожиданные (хотя и правильные) результаты, если функция не до конца понимает систему нумерации. Смотрите примеры с модификатором %V на этой странице руководства.

Смотрите также

Добавить

Примечания пользователей 1 note

up
5
divinity76+spam at gmail dot com
1 year ago
there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime
To Top