PHP 8.3.4 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 (а возможно и другие параметры), как и даты до Jan 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 Полная четырёхзначная версия %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 воскресенью присваивается номер 1. Как результат, %u может работать не так, как описано в этом руководстве.

Внимание

Только для Windows:

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

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

Внимание

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

timestamp

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

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

Возвращает строку, отформатированную в соответствии с параметром format, используя указанную временную метку timestamp или текущее время, если метка не была указана. Названия месяцев, дней недели и других языкозависимых строк будут взяты в соответствии с текущими настройками локали, установленной с помощью функции 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' => 'Четырёхзначная версия %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'                       ( Четырёхзначная версия %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 на данной странице.

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

add a note

User Contributed Notes 1 note

up
6
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