[英]How to get the day of the week from a tm object in C++?
我正在嘗試編寫一個程序,該程序解析一個表示日期格式為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()
文檔 ,“如果給出足夠的信息,則strftime()
可能會填充tm結構中的缺失字段”。 我沒有找到與put_time()
相同的信息( strftime()
似乎基於該信息),所以也許我期望的功能太多。
可以strptime()
自動填寫在本周(當天tm_wday
上輸入),給出年,月,日? 還是put_time()
可以在輸出中自動填充此信息? 如果不是,是否有另一種方法可以將此信息添加到tm
對象?
這是一種無需使用C API即可實現的方法,而是使用C ++ <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_point
的typedef
,但精度為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嘗試一下:
試試看(在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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.