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

Posted

技术标签:

【中文标题】如何从 C++ 中的 tm 对象获取星期几?【英文标题】:How to get the day of the week from a tm object in C++? 【发布时间】:2017-01-07 15:55:39 【问题描述】:

我正在尝试编写一个程序,它解析表示格式为 YYYYMMDD 的日期的字符串(使用 strptime())并以 dayOfWeek、Month Day、Year 的形式打印(使用 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() 也不填写此信息。

根据this documentation 对strftime() 的说法,“如果提供足够的信息,可以用strftime() 填充tm 结构中的缺失字段。”我还没有找到关于 put_time() 的相同信息(strftime() 似乎基于此),所以也许我对这个功能期望过高。

strptime() 能否在输入时自动填写星期几(tm_wday),给定年份、月份和日期?或者put_time() 可以在输出时自动填写这些信息吗?如果没有,还有其他方法可以将此信息添加到 tm 对象吗?

【问题讨论】:

tm 结构中缺少的字段可能被填补使用std::mktime 根据strptime,没有要求填写缺失的字段 从来没有想过会这么简单。我唯一要做的就是添加struct tm tm = 0;(将所有字段初始化为零)和tm.tm_isdst = -1;(强制DST 查找以防止错误)。谢谢! 【参考方案1】:

这是一种不使用 C API 的方法,而是使用 C++11/14 &lt;chrono&gt; 设施和 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

上面的date::sys_days 只是typedefstd::chrono::system_clock::time_point,但精度为days,而不是您的平台提供的任何值(微秒、纳秒等)。这意味着您可以轻松地为其添加其他持续时间,例如 std::chrono::hours、minutes、seconds、milliseconds 等。

cout << date::format("%A, %B %e, %Y %H:%M", tp + 2h + 35min ) << endl;

Tuesday, December 24, 2013 02:35

您可以将上面的代码粘贴到这个 wandbox 演示中,并自己尝试各种版本的 clang 和 gcc:

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

【讨论】:

【参考方案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;

【讨论】:

以上是关于如何从 C++ 中的 tm 对象获取星期几?的主要内容,如果未能解决你的问题,请参考以下文章

javascript如何获取一个月前的日期并取出星期几

javascript 从Date中获取星期几

从当前日期获取星期几并指定星期几

java中如何获取日期时间中的星期几?

当用户从日期选择器中选择日期时,如何在下拉列表中获取特定的星期几?

从prestosql中的日期列获取星期几?