gpt4 book ai didi

c++ - put_time() 忽略时区偏移量的转换说明符 'z'

转载 作者:行者123 更新时间:2023-11-30 04:45:31 27 4
gpt4 key购买 nike

下面的代码将打印带有时区偏移量的时间,传递小写格式说明符z:

#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;

int main() {
time_t current_time = time(nullptr);
tm* timeinfo = localtime(&current_time);
cout << put_time(timeinfo, "%c %z") << "\n";
return 0;
}

g++ -o time time.cpp -Wall -pedantic

函数put_time() (C++) 描述于 cppreference.com .格式说明符来自 strftime()。 (C)。您还可以在 C Standard 中阅读有关它们的信息,当前第 7.27.3.5 章中的第 396 页:

  %z

is replaced by the offset from UTC in the ISO 8601 format ‘‘−0430’’ (meaning 4 hours 30 minutes behind UTC, west of Greenwich), or by no characters if no time zone is determinable. [tm_isdst]

这在 Linux 上运行良好:

Fri Jul 26 12:30:02 2019 +0200

但在 Windows 上它又回来了:

07/26/19 12:03:53 Mitteleuropäisches Sommerzeit

错了,我的代码不要求时区名称,而是要求与 UTC 的偏移量。我在两个平台上都使用 GCC 作为编译器。

问题
我在这里做错了什么吗?还是 GCC 或 Microsoft Windows 违反了标准?我读到一些“谣言”,说它可能会受到 Windows 上某些设置的影响。

手动计算偏移量是相当危险的。最好的 helper 是tm.gmt_offset ,这是平台特定的字段。因此,gmt_offset 未列出且仅在基于 GNU 的系统上可用。我目前正在使用基于 GetTimeZoneInformation 的解决方法以及字段 BiasDaylightBias,这是特定于平台的 Windows-API。我感谢更安全的建议。

感谢您的帮助和见解!

环境:
GNU/Linux 与 GCC 9.1.0 (Archlinux)
带有 GCC 8.3.0 (MSYS2) 的 Windows

最佳答案

如果你愿意使用free, open-source (MIT license) 3rd party library , 它将给出可移植的结果。

#include "date/tz.h"
#include <iostream>

int
main()
{
using namespace date;
using namespace std;
using namespace std::chrono;
zoned_seconds zt{current_zone(), floor<seconds>(system_clock::now())};
cout << format("%c %z", zt) << '\n';
}

虽然在 Windows 上您需要安装 curl7-zip , 在 Linux 上你需要链接 -lcurl .更详细installation instructions are available here .

这是 C++20 草案的预览 <chrono>库,尽管不可否认 format 的语法由于上周在科隆进行的投票,声明将略有变化。 C++20 将包含 fmt library (这是个好消息)。

这个库仍然使用put_time对于 %c格式的一部分,但格式化 %z部分本身(并根据需要以 [+/-]hhmm 形式给出偏移量)。

关于c++ - put_time() 忽略时区偏移量的转换说明符 'z',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com