如何从C ++中的tm对象获取星期几?

时间:2017-01-07 15:55:39

标签: c++ date datetime c++11

我试图编写一个程序,该程序解析表示格式为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对象?

2 个答案:

答案 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自行试用:

http://melpon.org/wandbox/permlink/PodYB3AwdYNFKbMv

答案 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;
}