put_time 是否有一个转换说明符,该说明符输出月份中没有前导字符的个位数天数
Does put_time Have a Conversion Specifier Which Outputs Single Digit Days of the Month Without a Preceding Character
put_time
提供 2 个转换说明符用于输出月中的日期:
%d
: "Day of the month, zero-padded (01-31)"
%e
: "Day of the month, space-padded ( 1-31)"
请注意,这些转换说明符都不允许我输出一个月中的非填充日。因此,例如,给定 tm tmb
,如果我想将月中的某天输出为:
Feb 8 '18
我能做到:cout << put_time(&tmb, "%b%e '%y")
但是在 10th 将输出:
Feb10 '18
因此我必须做 janky:cout << put_time(&tmb, "%b ") << tmb.tm_mday << put_time(&tmb, " '%y")
是否有一个转换说明符,我可以使用它在单个 put_time
调用中完成所有这些?
为了回答这个问题,我从这里提取了我认为是转换说明符的完整列表:http://en.cppreference.com/w/cpp/io/manip/put_time and bundled them into a simple program:
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
。因此,您在这里需要的是 table 中的值“8”。快速搜索将证明没有。因此,您的问题的答案是:没有转换说明符可以输出没有前导字符的月份中的个位数天数。您将不得不使用类似于您所用的解决方法在问题中提出。
put_time
提供 2 个转换说明符用于输出月中的日期:
%d
: "Day of the month, zero-padded (01-31)"%e
: "Day of the month, space-padded ( 1-31)"
请注意,这些转换说明符都不允许我输出一个月中的非填充日。因此,例如,给定 tm tmb
,如果我想将月中的某天输出为:
Feb 8 '18
我能做到:cout << put_time(&tmb, "%b%e '%y")
但是在 10th 将输出:
Feb10 '18
因此我必须做 janky:cout << put_time(&tmb, "%b ") << tmb.tm_mday << put_time(&tmb, " '%y")
是否有一个转换说明符,我可以使用它在单个 put_time
调用中完成所有这些?
为了回答这个问题,我从这里提取了我认为是转换说明符的完整列表:http://en.cppreference.com/w/cpp/io/manip/put_time and bundled them into a simple program:
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
。因此,您在这里需要的是 table 中的值“8”。快速搜索将证明没有。因此,您的问题的答案是:没有转换说明符可以输出没有前导字符的月份中的个位数天数。您将不得不使用类似于您所用的解决方法在问题中提出。