put_time
предоставляет 2 спецификатора преобразования для выходного дня месяца:
%d
: «День месяца, дополненный нулями (01-31)»%e
: «День месяца, дополненный пробелами (1-31)»Обратите внимание, что ни один из этих спецификаторов преобразования не позволит мне вывести не дополненный день месяца. Так, например, учитывая tm tmb
, если я хочу вывести день месяца как:
8 февраля 18 года
Я мог бы сделать: cout << put_time(&tmb, "%b%e '%y")
Но это на 10го это выведет:
10 февраля 18 года
Таким образом, я должен сделать джанк: cout << put_time(&tmb, "%b ") << tmb.tm_mday << put_time(&tmb, " '%y")
Есть ли спецификатор преобразования, который я могу использовать, чтобы получить все это за один раз? put_time
вызов?
Чтобы ответить на этот вопрос, я вытащил отсюда полный список спецификаторов преобразования: http://en.cppreference.com/w/cpp/io/manip/put_time и связал их в простая программа:
tm tmb = { 5, 6, 7, 8, 9, 10 };
mktime(&tmb);
for(const auto i : { "%%", "%n", "%t", "%Y", "%EY", "%y", "%Oy", "%Ey", "%C", "%EC", "%G", "%g", "%b", "%h", "%B", "%m", "%Om", "%U", "%OU", "%W", "%OW", "%V", "%OV", "%j", "%d", "%Od", "%e", "%Oe", "%a", "%A", "%w", "%Ow", "%u", "%Ou", "%H", "%OH", "%I", "%OI", "%M", "%OM", "%S", "%OS", "%c", "%Ec", "%x", "%Ex", "%X", "%EX", "%D", "%F", "%r", "%R", "%T", "%p", "%z", "%Z" } ) {
cout << i << "\t|\t\"" << put_time(&tmb, i) << "\"\n";
}
Результат этого выглядит следующим образом:
%% | "%"%n | ""%t | " "%Y | "1910"%EY | "1910"%y | "10"%Oy | "10"%Ey | "10"%C | "19"%EC | "19"%G | "1910"%g | "10"%b | "Oct"%h | "Oct"%B | "October"%m | "10"%Om | "10"%U | "40"%OU | "40"%W | "40"%OW | "40"%V | "40"%OV | "40"%j | "281"%d | "08"%Od | "08"%e | " 8"%Oe | " 8"%a | "Sat"%A | "Saturday"%w | "6"%Ow | "6"%u | "6"%Ou | "6"%H | "07"%OH | "07"%I | "07"%OI | "07"%M | "06"%OM | "06"%S | "05"%OS | "05"%c | "Sat Oct 8 07:06:05 1910"%Ec | "Sat Oct 8 07:06:05 1910"%x | "10/08/10"%Ex | "10/08/10"%X | "07:06:05"%EX | "07:06:05"%D | "10/08/10"%F | "1910-10-08"%r | "07:06:05 AM"%R | "07:06"%T | "07:06:05"%p | "AM"%z | "+0000"%Z | "UTC"
Поле, о котором идет речь, является tmb.tm_mday
который заполнен 8
, Таким образом, то, что вам нужно здесь, это значение в таблице «8». Быстрый поиск покажет, что его нет. Таким образом, ответ на ваш вопрос: Не существует спецификатора преобразования, который выводит однозначные дни месяца без предшествующего символа. Вам придется использовать обходной путь, аналогичный тому, который вы предложили в этом вопросе.
Других решений пока нет …