如何从 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 <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
上面的date::sys_days
只是typedef
的std::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 对象获取星期几?的主要内容,如果未能解决你的问题,请参考以下文章