如何使用put_time()格式化日期以去除前导空格和零?

3

我的程序解析一个表示日期的字符串,格式为YYYYMMDD,并以星期几,月份,日期,年份的形式打印出来。例如,给定字符串20131224,程序应该打印Sunday, December 24, 2013

我编写的程序正是如此:

#include <iostream>
#include <sstream>
#include <ctime>
#include <iomanip>

using namespace std;

int main() {
    struct tm tm;
    string s("20131224");
    if (strptime(s.c_str(), "%Y%m%e", &tm)) {
        cout << put_time(&tm, "%A, %B %e, %Y") << endl;
    }
}

我的问题是,当给定一个带有前导零的日期字符串,比如20131204时,输出结果在月份和日期之间会多出一个空格,像这样:Sunday, December 4, 2013
我知道如果使用%d而不是%e,那么这个空格将被替换为零,但这也不是我想要的。我知道删除%B%e之间的空格可以解决单个数字日期的问题,但对于两位数字的日期就不起作用了(因为它会打印Sunday, December24, 2013)。我知道我可以使用某种正则表达式搜索来查找并替换那个双空格,但肯定有更简单的解决方案。
如何从使用put_time()格式化的日期中同时删除前导空格和零?
1个回答

2

试试这个:

cout << put_time(&tm, tm.tm_mday < 10 ? 
                      "%A, %B%e, %Y" : 
                      "%A, %B %e, %Y" ) << endl;

1
可以,谢谢。但是,仅仅打印一个没有前导空格或零的日期就需要像这样的hack,这不是很疯狂吗? - Alex Johnson
这不可能是真的,天啊,天啊 - Lukas Salich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接