输出ISO 8601格式的日期

Outputting date in ISO 8601 format

本文关键字:日期 格式 8601 ISO 输出      更新时间:2023-10-16

如何在C++中获得以下格式的日期:

2016-04-26T19:50:48Z
#include <chrono>
#include <ctime>
time_t _tm = time(NULL);
struct tm*curtime = localtime(&_tm);

并输出为asctime(curtime)

当前输出为:"Thu Apr 28 16:02:41 2016n"

文档是您的朋友:

std::time_t t
    = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::cout << std::put_time( std::localtime( &t ), "%FT%T%z" );

在我的系统中产生

2016-04-29T02:48:56+0200

基于@Uri的答案,该答案修复了一些错误,并以ISO8601格式显示了正确时区中的时间和毫秒:

auto now = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&time);
long long timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
std::cout << std::setfill('0') 
          << std::put_time(now_tm, "%FT%H:%M:")
          << std::setw(2) << (timestamp / 1000) % 60 << '.'
          << std::setw(3) << timestamp % 1000
          << std::put_time(now_tm, "%z");

我将提供日历值的std::localtime与提供精确方法的std::chrono函数相结合。这是我的代码:

#include <ctime>
#include <chrono>
...
auto now = std::chrono::system_clock::now();
auto now_c = std::chrono::system_clock::to_time_t(now)
auto now_tm = std::localtime(&now_c);
auto now_since_epoch = now.time_since_epoch();    // since 1970
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now_since_epoch).count();
std::cout << std::setfill('0') <<
    std::setw(4) << now_tm->tm_year + 1900 << '-' <<
    std::setw(2) << now_tm->tm_mon + 1 << '-' <<
    std::setw(2) << now_tm->tm_mday << 'T' <<
    std::setw(2) << now_ms % (24*60*60*1000) << ':' <<
    std::setw(2) << now_ms % (60*60*1000) << ':' <<
    std::setw(2) << now_ms % (60*1000) << '.' <<
    std::setw(3) << now_ms % (1000);

虽然冗长,但它实际上做得比strftime少。