std::strftime 在 windows 中使用 gmtime 将时区 UTC 显示为 UTC+1
std::strftime displays timezone UTC as UTC+1 using gmtime in windows
我试图理解为什么 windows(在 linux 作品中)std::strftime 将时区 UTC 显示为 UTC+1。
如果我运行下一个代码
#include <ctime>
#include <chrono>
#include <string>
#include <iostream>
int main()
{
std::time_t t = std::time(nullptr);
char utc_str[80];
std::strftime(utc_str, 80, "%H:%M:%S %z", std::gmtime(&t));
std::string utcStd = { utc_str };
std::cout << "UTC: " << utcStd << std::endl;
char local_str[80];
std::strftime(local_str, 80, "%H:%M:%S %z", std::localtime(&t));
std::string localStd = { local_str };
std::cout << "Local: " << std::string(localStd) << std::endl;
return 0;
}
我得到下一个输出:
UTC: 07:26:18 +0100
Local: 09:26:18 +0200
UTC 和当地时间正确但 UTC 时区不正确。
有什么想法吗?
Microsoft 一直以其 C 库函数的实现与标准中指定的工作方式有所不同而闻名。其他这样做的平台供应商是 Apple。因为它已经持续了几十年,所以一定是深思熟虑的策略。
在 strftime 的 Visual Studio 实现中有 bugs reported 个关于那个时区的信息。也许您观察到的是其他“错误”、相同“错误”的其他表现形式或某些“修复”的新表现形式。
使用一些开源库可能比这些库供应商提供的更令人头疼。典型的建议是 boost but I have observed it to be inefficient and to misbehave. The one by Howard Hinnant 相当不错。
我试图理解为什么 windows(在 linux 作品中)std::strftime 将时区 UTC 显示为 UTC+1。
如果我运行下一个代码
#include <ctime>
#include <chrono>
#include <string>
#include <iostream>
int main()
{
std::time_t t = std::time(nullptr);
char utc_str[80];
std::strftime(utc_str, 80, "%H:%M:%S %z", std::gmtime(&t));
std::string utcStd = { utc_str };
std::cout << "UTC: " << utcStd << std::endl;
char local_str[80];
std::strftime(local_str, 80, "%H:%M:%S %z", std::localtime(&t));
std::string localStd = { local_str };
std::cout << "Local: " << std::string(localStd) << std::endl;
return 0;
}
我得到下一个输出:
UTC: 07:26:18 +0100
Local: 09:26:18 +0200
UTC 和当地时间正确但 UTC 时区不正确。
有什么想法吗?
Microsoft 一直以其 C 库函数的实现与标准中指定的工作方式有所不同而闻名。其他这样做的平台供应商是 Apple。因为它已经持续了几十年,所以一定是深思熟虑的策略。
在 strftime 的 Visual Studio 实现中有 bugs reported 个关于那个时区的信息。也许您观察到的是其他“错误”、相同“错误”的其他表现形式或某些“修复”的新表现形式。
使用一些开源库可能比这些库供应商提供的更令人头疼。典型的建议是 boost but I have observed it to be inefficient and to misbehave. The one by Howard Hinnant 相当不错。