我试图编写一个程序,该程序解析表示格式为YYYYMMDD(使用strptime()
)的日期的字符串,并以dayOfWeek,Month Day,Year的形式打印(使用{{1} })。这就是我到目前为止所拥有的:
put_time()
问题是,无论日期如何,星期几总是星期日。
#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;
}
}
如果只提供一年,一个月和一天,然后strptime()
未填写此信息,则put_time()
没有填充星期几信息似乎是一个问题。
根据strftime()
的{{1}},&#34;如果有足够的信息,则strftime()
可能会填写tm结构中缺少的字段。&#34;我还没有找到关于put_time()
(strftime()
似乎是基于的)的相同信息,所以也许我预计会有太多的功能。
根据年份,月份和日期,strptime()
可以自动填写一周中的某一天(tm_wday
)吗?或者put_time()
可以自动填写输出信息吗?如果没有,是否有另一种方法可以将此信息添加到tm
对象?
答案 0 :(得分:4)
这是一种不使用C API的方法,而是使用C ++ 11/14 <chrono>
工具和free, open-source, header-only library。
#include "date.h"
#include <iostream>
#include <sstream>
using namespace std;
int main() {
istringstream s("20131224");
date::sys_days tp;
s >> date::parse("%Y%m%e", tp);
if (!s.fail())
cout << date::format("%A, %B %e, %Y", tp) << endl;
}
输出:
Tuesday, December 24, 2013
上面的{p> date::sys_days
只是typedef
的{{1}},但精度为std::chrono::system_clock::time_point
,而不是平台提供的任何内容(微秒,纳秒,等等)。这意味着您可以轻松地为其添加其他持续时间,例如std :: chrono ::小时,分钟,秒,毫秒等。
days
您可以将以上代码粘贴到此wandbox演示中,并针对各种版本的clang和gcc自行试用:
答案 1 :(得分:2)
试试这个(在Mac中编译)
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
const string DAY[]={"Sun","Mon","Tue",
"Wed","Thu","Fri","Sat"};
time_t rawtime;
tm * timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
int weekday=timeinfo->tm_wday;
cout << "Today is: " << DAY[weekday] << "\n" << endl;
return 0;
}