在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();