當前位置: 首頁>>技術問答>>正文


在C++中如何獲取當前日期和時間?

在C++中有沒有跨平台的(cross-platform)方法來獲取當前日期和時間?

最佳解決方案

在C++ 11中,您可以使用std::chrono::system_clock::now()

次佳解決方案

C++與C共享其日期/時間函數.tm structure可能是C++程序員最容易使用的 – 以下打印今天的日期:

#include <ctime>
#include <iostream>

int main() {
    std::time_t t = std::time(0);   // get time now
    std::tm* now = std::localtime(&t);
    std::cout << (now->tm_year + 1900) << '-' 
         << (now->tm_mon + 1) << '-'
         <<  now->tm_mday
         << "\n";
}

第三種解決方案

您可以嘗試以下跨平台代碼來獲取當前日期/時間:

#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
const std::string currentDateTime() {
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime
    // for more information about date/time format
    strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);

    return buf;
}

int main() {
    std::cout << "currentDateTime()=" << currentDateTime() << std::endl;
    getchar();  // wait for keyboard input
}

輸出:

currentDateTime()=2012-05-06.21:47:59

有關日期/時間格式的更多信息,請訪問here

第四種方案

std C庫提供time()。這是紀元的秒數​​,可以使用標準C函數轉換為日期和H:M:S。 Boost還有a time/date library,您可以查看。

time_t  timev;
time(&timev);

第五種方案

C++標準庫不提供合適的日期類型。 C++繼承了C語言中日期和時間操作的結構和函數,以及考慮本地化的幾個日期/時間輸入和輸出函數。

// Current date/time based on current system
time_t now = time(0);

// Convert now to tm struct for local timezone
tm* localtm = localtime(&now);
cout << "The local date and time is: " << asctime(localtm) << endl;

// Convert now to tm struct for UTC
tm* gmtm = gmtime(&now);
if (gmtm != NULL) {
cout << "The UTC date and time is: " << asctime(gmtm) << endl;
}
else {
cerr << "Failed to get the UTC date and time" << endl;
return EXIT_FAILURE;
}

第六種方案

舊問題的新答案:

問題沒有說明在什麽時區。有兩種合理的可能性:

  1. 在UTC中。

  2. 在計算機的本地時區。

對於1,您可以使用this date library和以下程序:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << system_clock::now() << '\n';
}

這隻是輸出給我:

2015-08-18 22:08:18.944211

日期庫基本上隻是為std::chrono::system_clock::time_point添加了一個流操作符。它還添加了許多其他不錯的功能,但這並沒有在這個簡單的程序中使用。

如果您更喜歡2(本地時間),則有一個timezone library構建在date library之上。假設編譯器支持C++ 11或C++ 14,這兩個庫都是開源和跨平台的。

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    auto local = make_zoned(current_zone(), system_clock::now());
    std::cout << local << '\n';
}

這對我來說隻輸出:

2015-08-18 18:08:18.944211 EDT

來自make_zoned的結果類型是date::zoned_time,其是date::time_zonestd::chrono::system_clock::time_point的配對。此對代表本地時間,但也可以表示UTC,具體取決於您查詢它的方式。

通過上麵的輸出,您可以看到我的計算機當前處於UTC偏移為-4h的時區,並且縮寫為EDT。

如果需要其他時區,也可以完成。例如,要查找悉尼當前時間,澳大利亞隻需將變量local的構造更改為:

auto local = make_zoned("Australia/Sydney", system_clock::now());

輸出變為:

2015-08-19 08:08:18.944211 AEST

第七種方案

(對於穀歌同行)

還有Boost::date_time

#include <boost/date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();

c++日期時間

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3902.html,未經允許,請勿轉載。