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/strftimeSome formats can be replaced with the `date` function, for example:
    strftime("%Y-%m-%d", $time);
can be replaced with
    date("Y-m-d", $time);Year is being displayed wrongly. It is displaying 2025 instead of 2024
E.g.   strftime("%G-%B-%d %H:%M:%S", strtotime(date('2024-12-30 10:10:10'))); 
Output: 2025-December-30 10:10:10 
 
Here G represents 4-digit year corresponding to the ISO week number. Based on this ISO week number year value will be displayed
Here B represents full month name
Here d represents day of the month (01 to 31)
 
Now because of this %G value we are getting the issue as ISO week number is calculated wrongly. 
For example, If 30th December is falling on Monday, Tuesday, or Wednesday it is in W01 of the next year. 
If it is on a Thursday, it is in W53 of the year just ending. 
If on a Friday it is in W52 of the year just ending in common years and W53 in leap years. 
If on a Saturday or Sunday, it is in W52 of the year just ending.
In this way week calculation happens and as 30th falls on Monday it is taking as W01 of the next year and it displays wrong year output.
For previous year no issue for this error because 30 and 31st Dec falls on sat or Sunday .
 
This same error occurs even if the Jan 1st falls on Friday. Then it will calculate it as W53 and displays the previous year value instead of current year.