Spec-Zone.ru › C++

std::strftime

Определено в заголовочном файле <ctime>
std::size_t strftime( char* str, std::size_t count, const char* format, const std::tm* tp );

Преобразует информацию о дате и времени из заданного календарного времени tp в строку символов с нулевым окончанием str в соответствии со строкой формата строка формата format. Максимально записывается count байтов.

Параметры

str - указатель на первый элемент массива char для вывода
count - максимальное количество байтов для записи
format - указатель на строку символов с нулевым окончанием, определяющая формат преобразования
tp - указатель на объект, содержащий информацию о дате и времени для преобразования

Строка формата

Строка формата состоит из нуля или более спецификаторов преобразования и обычных символов (кроме %). Все обычные символы, включая завершающий нулевой символ, копируются в выходную строку без изменений. Каждый спецификатор преобразования начинается с символа % , необязательно после которого следуют E или O модификаторы (игнорируются, если не поддерживаются локалью), а затем символ, определяющий поведение спецификатора. Доступны следующие спецификаторы формата:

Спецификатор преобразования
Объяснение Используемые поля
% выводит литерал %. Полная спецификация преобразования должна быть %%.
n
(C++11)
выводит символ новой строки
t
(C++11)
выводит символ горизонтальной табуляции
Год
Y выводит год как десятичное число, например 2017 tm_year
EY
(C++11)
выводит год в альтернативном представлении, например 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP tm_year
y выводит последние 2 цифры года как десятичное число (диапазон [00,99]) tm_year
Oy
(C++11)
выводит последние 2 цифры года с использованием альтернативной системы счисления, например 十一 вместо 11 в локали ja_JP tm_year
Ey
(C++11)
выводит год как смещение от альтернативного периода календаря локали %EC (зависит от локали) tm_year
C
(C++11)
выводит первые 2 цифры года как десятичное число (диапазон [00,99]) tm_year
EC
(C++11)
выводит имя базового года (периода) в альтернативном представлении локали, например 平成 (эра Хэйсэй) в локали ja_JP tm_year
G
(C++11)
выводит год по ISO 8601, основанный на неделе, т. е. год, содержащий указанную неделю.

В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
tm_year, tm_wday, tm_yday
g
(C++11)
выводит последние 2 цифры года по ISO 8601, основанного на неделе, т. е. год, содержащий указанную неделю (диапазон [00,99]).

В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
tm_year, tm_wday, tm_yday
Месяц
b выводит сокращенное имя месяца, например Oct (зависит от локали) tm_mon
h
(C++11)
синоним b tm_mon
B выводит полное имя месяца, например October (зависит от локали) tm_mon
m выводит месяц как десятичное число (диапазон [01,12]) tm_mon
Om
(C++11)
выводит месяц с использованием альтернативной системы счисления, например 十二 вместо 12 в локали ja_JP tm_mon
Неделя
U выводит номер недели в году как десятичное число (воскресенье — первый день недели) (диапазон [00,53]) tm_year, tm_wday, tm_yday
OU
(C++11)
выводит номер недели в году, как и %U, с использованием альтернативной системы счисления, например 五十二 вместо 52 в локали ja_JP tm_year, tm_wday, tm_yday
W выводит номер недели в году как десятичное число (понедельник — первый день недели) (диапазон [00,53]) tm_year, tm_wday, tm_yday
OW
(C++11)
выводит номер недели в году, как и %W, с использованием альтернативной системы счисления, например 五十二 вместо 52 в локали ja_JP tm_year, tm_wday, tm_yday
V
(C++11)
выводит неделю ISO 8601 года (диапазон [01,53]).

В ISO 8601 недели начинаются с понедельника, и первая неделя года должна удовлетворять следующим требованиям:

  • Включает 4 января
  • Включает первый четверг года
tm_year, tm_wday, tm_yday
OV
(C++11)
выводит номер недели в году, как и %V, с использованием альтернативной системы счисления, например 五十二 вместо 52 в локали ja_JP tm_year, tm_wday, tm_yday
День года/месяца
j выводит день года как десятичное число (диапазон [001,366]) tm_yday
d выводит день месяца как десятичное число (диапазон [01,31]) tm_mday
Od
(C++11)
выводит день месяца (нумерация с нуля) с использованием альтернативной системы счисления, например 二十七 вместо 27 в локали ja_JP

Одиночный символ предваряется пробелом.

tm_mday
e
(C++11)
выводит день месяца как десятичное число (диапазон [1,31]).

Одиночная цифра предваряется пробелом.

tm_mday
Oe
(C++11)
выводит день месяца (нумерация с единицы) с использованием альтернативной системы счисления, например 二十七 вместо 27 в локали ja_JP

Одиночный символ предваряется пробелом.

tm_mday
День недели
a выводит сокращенное имя дня недели, например Fri (зависит от локали) tm_wday
A выводит полное имя дня недели, например Friday (зависит от локали) tm_wday
w выводит день недели как десятичное число, где воскресенье — 0 (диапазон [0-6]) tm_wday
Ow
(C++11)
выводит день недели с использованием альтернативной системы счисления, где воскресенье — 0, например 二 вместо 2 в локали ja_JP tm_wday
u
(C++11)
выводит день недели как десятичное число, где понедельник — 1 (формат ISO 8601) (диапазон [1-7]) tm_wday
Ou
(C++11)
выводит день недели с использованием альтернативной системы счисления, где понедельник — 1, например 二 вместо 2 в локали ja_JP tm_wday
Час, минута, секунда
H выводит час как десятичное число, 24-часовой формат (диапазон [00-23]) tm_hour
OH
(C++11)
выводит час из 24-часового формата с использованием альтернативной системы счисления, например 十八 вместо 18 в локали ja_JP tm_hour
I выводит час как десятичное число, 12-часовой формат (диапазон [01,12]) tm_hour
OI
(C++11)
выводит час из 12-часового формата с использованием альтернативной системы счисления, например 六 вместо 06 в локали ja_JP tm_hour
M выводит минуту как десятичное число (диапазон [00,59]) tm_min
OM
(C++11)
выводит минуту с использованием альтернативной системы счисления, например 二十五 вместо 25 в локали ja_JP tm_min
S выводит секунду как десятичное число (диапазон [00,60]) tm_sec
OS
(C++11)
выводит секунду с использованием альтернативной системы счисления, например 二十四 вместо 24 в локали ja_JP tm_sec
Другое
c выводит стандартную строку даты и времени, например Sun Oct 17 04:41:13 2010 (зависит от локали) все
Ec
(C++11)
выводит альтернативную строку даты и времени, например с использованием 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локали ja_JP все
x выводит локализованное представление даты (зависит от локали) все
Ex
(C++11)
записывает альтернативное представление даты, например, используя 平成23年 (год Хэйсэй 23) вместо 2011年 (год 2011) в локале ja_JP все
X записывает локализованное представление времени, например, 18:40:20 или 6:40:20 PM (зависит от локали) все
EX
(C++11)
записывает альтернативное представление времени (зависит от локали) все
D
(C++11)
эквивалентно "%m/%d/%y" tm_mon, tm_mday, tm_year
F
(C++11)
эквивалентно "%Y-%m-%d" (формат даты ISO 8601) tm_mon, tm_mday, tm_year
r
(C++11)
записывает локализованное время в 12-часовом формате (зависит от локали) tm_hour, tm_min, tm_sec
R
(C++11)
эквивалентно "%H:%M" tm_hour, tm_min
T
(C++11)
эквивалентно "%H:%M:%S" (формат времени ISO 8601) tm_hour, tm_min, tm_sec
p записывает локализованные обозначения a.m. или p.m. (зависит от локали) tm_hour
z
(C++11)
записывает смещение от UTC в формате ISO 8601 (например, -0430), или не записывает символы, если информация о часовом поясе недоступна tm_isdst
Z записывает локализованное название или аббревиатуру часового пояса, или не записывает символы, если информация о часовом поясе недоступна tm_isdst

Результат

Количество байтов, записанных в массив символов, на который указывает str, не включая завершающий '\0' при успешном выполнении. Если count был достигнут до того, как вся строка могла быть сохранена, возвращается ​0​, и содержимое неопределено.

Пример

#include <ctime>
#include <iostream>
#include <iterator>
#include <locale>
 
void utcExample()
{
    // Example of the very popular RFC 3339 format UTC time
    std::time_t time = std::time({});
    char timeString[std::size("yyyy-mm-ddThh:mm:ssZ")];
    std::strftime(std::data(timeString), std::size(timeString),
                  "%FT%TZ", std::gmtime(&time));
    std::cout << timeString << '\n';
}
 
int main()
{
    std::time_t t = std::time(nullptr);
    char mbstr[100];
 
    if (std::strftime(mbstr, sizeof(mbstr), "%A %c", std::localtime(&t)))
        std::cout << mbstr << '\n';
 
    std::locale::global(std::locale("ja_JP.utf8"));
    if (std::strftime(mbstr, sizeof(mbstr), "%A %c", std::localtime(&t)))
        std::cout << mbstr << '\n';
 
    utcExample();
}

Возможный результат:

Tuesday Tue Sep  7 19:40:35 2021
火曜日 2021年09月07日 19時40分35秒
2021-09-07T19:40:35Z

См. также

asctime
преобразует объект std::tm в текстовое представление
(функция)
ctime
преобразует объект std::time_t в текстовое представление
(функция)
wcsftime
преобразует объект std::tm в текстовое представление в виде строки широких символов
(функция)
put_time
(C++11)
форматирует и выводит значение даты/времени в соответствии с указанным форматом
(функция-шаблон)
std::formatter<std::chrono::hh_mm_ss>
(C++20)
поддержка форматирования для hh_mm_ss
(специализация шаблона класса)
C документация для strftime

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/chrono/c/strftime

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API