在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;
}
第六種方案
舊問題的新答案:
問題沒有說明在什麽時區。有兩種合理的可能性:
-
在UTC中。
-
在計算機的本地時區。
對於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_zone
和std::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
第七種方案
(對於穀歌同行)
#include <boost/date_time/posix_time/posix_time.hpp>
boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();