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

How to get the day of the week from a tm object in C++?

本文关键字:对象 取星期几 tm 中从 C++      更新时间:2023-10-16

我正在尝试编写一个程序,该程序解析表示日期格式为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()也不填充此信息,这似乎是一个问题。

根据strftime()的文档,"如果提供足够的信息,tm结构中缺失的字段可以由strftime()填充。"我还没有找到关于put_time()(strftime()似乎是基于它)的相同信息,所以我可能对该函数期望过高。

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

这里有一种方法,不使用C API,而是使用C++11/14<chrono>设施和这个免费的、开源的、仅头程序库。

#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只是std::chrono::system_clock::time_pointtypedef,但精度为days,而不是您的平台提供的任何东西(微秒、纳秒等)。这意味着你可以很容易地添加其他持续时间,比如std::chrono::小时、分钟、秒、毫秒等。

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

试试这个(在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;
}