there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime
(PHP 4, PHP 5, PHP 7, PHP 8)
strftime — Форматирует местную дату и время с учётом региональных настроек
Функция УСТАРЕЛА с PHP 8.1.0. Полагаться на функцию настоятельно не рекомендуют.
Разработчикам доступны следующие альтернативы:
Функция форматирует дату и время с учётом локали. Названия месяцев и дней недели, а также другие строки, которые зависят от языка, будут соответствовать текущим языковым настройкам, которые установили функцией setlocale().
Текущая библиотека языка C не всегда поддерживает каждый спецификатор преобразования,
и тогда функция strftime() тоже не будет поддерживать каждый спецификатор.
Кроме того, не каждая платформа поддерживает отрицательные метки времени, поэтому диапазон дат
иногда ограничивается эпохой Unix. Это означает, что спецификаторы %e, %T, %R и %D (и, возможно,
другие), как и даты до 1 января 1970
, не поддерживаются
ОС Windows, отдельными версиями систем Linux и рядом других операционных системам.
Список спецификаторов преобразования для Windows-систем даёт страница
» на сайте MSDN.
Вместо этой функции вызывают метод IntlDateFormatter::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 на этой странице руководства.
there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime