如何在 Windows 上获取 ISO 8601 格式的日期时间?

ole*_*sii 6 c++ windows datetime iso8601 datetime-format

在 Windows 上使用 C++ 获取ISO8601格式的日期时间的标准方法是什么?具体来说,我希望将其格式设置为:

2017-02-22T10:00:00.123-05:00 2017-02-22T10:00:00.123 >>> -05:00 <<< # how to print the offset?

我正在考虑组合GetLocalTime和的输出GetTimeZoneInformation,但这看起来很深奥。SO 上也有类似的问题,但是,我还没有找到一个以所需格式打印 UTC 偏移量的问题。有更好的方法吗?

mpi*_*tek 1

也许是这样的。我们调用GetLocalTime然后GetTimeZoneInformation将其传递给返回格式化字符串的函数。

这是写得很快的,除了观察它现在在我的机器上返回正确结果的事实之外,没有经过测试。它的运作基于这样一个事实:在几分钟内就可以设置SYSTEMTIME一个成员。因此,除以 60 并取其绝对值即可得到小时数。然后我们以类似的方式获取分钟并根据 if 设置符号BiasUTC = Localtime + BiasBiasBias > 0

#include <Windows.h>
#include <string>
#include <sstream>
#include <iomanip>
#include <cmath>

std::string format_system_time(const SYSTEMTIME& sys_time, const TIME_ZONE_INFORMATION& time_zone)
{
    std::ostringstream formatted_date_time;
    formatted_date_time << std::setfill('0');
    formatted_date_time << sys_time.wYear <<  "-" << std::setw(2) << sys_time.wMonth << "-" <<
        std::setw(2) << sys_time.wDay << "T" << std::setw(2) << sys_time.wHour << ":" <<
        std::setw(2) << sys_time.wMinute << ":" << std::setw(2) << sys_time.wSecond << "." <<
        std::setw(3) << sys_time.wMilliseconds;

    //UTC = localtime + bias; bias is in minutes
    int utc_offset_hours = time_zone.Bias / 60;
    int utc_offset_minutes = std::abs(time_zone.Bias - (utc_offset_hours * 60));
    char offset_sign = time_zone.Bias > 0 ? '-' : '+';
    formatted_date_time << offset_sign << std::setw(2) << std::abs(utc_offset_hours) << ":" << utc_offset_minutes;

    return formatted_date_time.str();
}

int main(int argc, char* argv[])
{
    SYSTEMTIME date_and_time;
    GetLocalTime(&date_and_time);

    TIME_ZONE_INFORMATION time_zone;
    GetTimeZoneInformation(&time_zone);

    auto& formatted_date_time = format_system_time(date_and_time, time_zone);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)