当前位置: 首页>>技术问答>>正文


在C++中如何获取当前日期和时间?

qingchuanTR 技术问答 , , , , , 去评论

在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/article/3902.html,未经允许,请勿转载。