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 相当不错。