0

put_time提供 2 个转换说明符用于输出月份中的某天:

  1. %d: "月份中的某一天,零填充 (01-31)"
  2. %e:“月份中的日期,空格填充(1-31)”

请注意,这些转换说明符都不允许我输出一个月中未填充的日期。因此,例如,tm tmb如果我想将月份中的某天输出为:

2018 年 2 月 8 日

我可以做:cout << put_time(&tmb, "%b%e '%y")

但是在 10将输出:

2018 年 2 月 10 日

因此,我必须做 janky:cout << put_time(&tmb, "%b ") << tmb.tm_mday << put_time(&tmb, " '%y")

是否有一个转换说明符可用于在一次put_time调用中获取所有内容?

4

1 回答 1

1

为了回答这个问题,我从这里提取了我认为是转换说明符的综合列表: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”表中的一个值。快速搜索将证明没有。因此,您的问题的答案是:没有转换说明符可以在没有前导字符的情况下输出月份中的单个数字天数。您将不得不使用类似于您在问题中提供的解决方法。

于 2018-02-09T13:56:05.697 回答