date::make_zoned 在 Windows 上崩溃

问题描述 投票:0回答:1

我正在为Windows 11和CentOS7(其最新的GCC版本是11)编写C++跨平台应用程序。

我的应用程序必须使用 Howard Hinnant 先生的

date.h
(而不是
std::chrono
)来解析时区字符串。

add_executable(myapp myapp.cpp)
set_target_properties(myapp PROPERTIES CXX_STANDARD 17)
target_link_libraries(myapp PRIVATE date::date date::date-tz)
std::string time_with_tz = "2024-09-30 14:53:27.123456 UTC";

std::stringstream ss(time_with_tz);
std::chrono::system_clock::time_point tp_with_tz;
date::from_stream(ss, "%F %T %Z", tp_with_tz); // date::parse does not work for me in both Win & Linux

date::format("%F %T %Z", date::make_zoned(date::current_zone(), tp_with_tz))

我已从

http://www.iana.org/time-zones
windowsZones.xml 手动下载最新的 tzdb-2024b.tar.lz
C:\users\01258\downloads\tzdata

我的代码在 Linux 中运行成功,但在 Windows 中调用

date::make_zoned
时,相同的代码崩溃了。我的申请中可能缺少什么?我什至尝试使用
.\vcpkg.exe install date[remote-api]:x64-windows
安装它,但它也不起作用,在 Windows 中仍然崩溃。

c++ windows date cross-platform
1个回答
0
投票

不是积极的,但我强烈怀疑这是这个问题的重复。

简而言之,tzdb-2024b 在一个地方本来打算使用“Apr”,但引入了字符串“April”。 根据 IANA 规范,这是允许的,但仍然破坏了多个解析器,包括我的解析器。

已采取两件事来解决此问题:

  • IANA 数据库已修补恢复为“4 月”,但尚未发布。
  • Howard 的库已在tip-of-master 上进行了修补以接受“April”,但新版本尚未发布。
  1. 您可以将日期库升级为tip-of-master,或者
  2. 您可以手动下载tzdb-2024a.tar.lz,或者
  3. 编辑您的 IANA tzdata/northamercia 文件:将其中一个(非注释)行(第 2634 行)上的“April”更改为“Apr”。
© www.soinside.com 2019 - 2024. All rights reserved.