簡體   English   中英

如何從C ++中的tm對象獲取星期幾?

[英]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_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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM