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 偏移量的问题。有更好的方法吗?
也许是这样的。我们调用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)
| 归档时间: |
|
| 查看次数: |
3830 次 |
| 最近记录: |