在c++中是否有跨平台的方法来获取当前的日期和时间?


当前回答

下面是不弃用的现代c++解决方案,用于将时间戳作为std::string用于例如文件名:

std::string get_file_timestamp()
{
    const auto now = std::chrono::system_clock::now();
    const auto in_time_t = std::chrono::system_clock::to_time_t(now);

    std::stringstream output_stream;

    struct tm time_info;
    const auto errno_value = localtime_s(&time_info, &in_time_t);
    if(errno_value != 0)
    {
        throw std::runtime_error("localtime_s() failed: " + std::to_string(errno_value));
    }

    output_stream << std::put_time(&time_info, "%Y-%m-%d.%H_%M_%S");
    return output_stream.str();
}

其他回答

这适用于g++,我不确定这是否对你有帮助。 项目输出:

The current time is 11:43:41 am
The current date is 6-18-2015 June Wednesday 
Day of month is 17 and the Month of year is 6,
also the day of year is 167 & our Weekday is 3.
The current year is 2015.

代码:

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

using namespace std;

const std::string currentTime() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%H:%M:%S %P", &tstruct);
return buf;
}

const std::string currentDate() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%B %A ", &tstruct);
return buf;
}

int main() {
    cout << "\033[2J\033[1;1H"; 
std:cout << "The current time is " << currentTime() << std::endl;
    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
    cout << "The current date is " << now->tm_mon + 1 << '-' 
         << (now->tm_mday  + 1) << '-'
         <<  (now->tm_year + 1900) 
         << " " << currentDate() << endl; 

 cout << "Day of month is " << (now->tm_mday) 
      << " and the Month of year is " << (now->tm_mon)+1 << "," << endl;
    cout << "also the day of year is " << (now->tm_yday) 
         << " & our Weekday is " << (now->tm_wday) << "." << endl;
    cout << "The current year is " << (now->tm_year)+1900 << "." 
         << endl;
 return 0;  
}

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;
}

c++与C共享它的日期/时间函数。tm结构可能是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";
}

老问题的新答案:

这个问题没有指定在哪个时区。有两种合理的可能性:

在UTC。 在计算机的本地时区。

对于1,你可以使用这个日期库和下面的程序:

#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库构建在日期库之上。这两个库都是开源和跨平台的,假设编译器支持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

适用于c++ 20

这个库现在在c++ 20中被广泛采用。命名空间date已经消失,现在所有内容都在命名空间std::chrono中。并使用zoned_time代替make_time。删除标题“date.h”和“tz.h”,只使用<chrono>。

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto local = zoned_time{current_zone(), system_clock::now()};
    std::cout << local << '\n';  // 2021-05-03 15:02:44.130182 EDT
}

在我写这篇文章的时候,部分实现刚刚开始出现在一些平台上。

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

int main ()
{
  time_t rawtime;
  struct tm * timeinfo;

  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  printf ( "Current local time and date: %s", asctime (timeinfo) );

  return 0;
}