gpt4 book ai didi

c++ - 时区解析,包括时区

转载 作者:行者123 更新时间:2023-12-02 09:58:21 24 4
gpt4 key购买 nike

我正在使用@ howard-hinnant的日期库(现在是C++ 20的一部分)来解析包含时区缩写的日期字符串。进行分析时没有错误,但似乎时区已被忽略。例如:

        istringstream inEst{"Fri, 25 Sep 2020 13:44:43 EST"};
std::chrono::time_point<std::chrono::system_clock, chrono::seconds> tpEst;
inEst >> date::parse("%a, %d %b %Y %T %Z", tpEst);
std::cout << chrono::duration_cast<chrono::milliseconds>( tpEst.time_since_epoch() ).count() << std::endl;

istringstream inPst{"Fri, 25 Sep 2020 13:44:43 PST"};
std::chrono::time_point<std::chrono::system_clock, chrono::seconds> tpPst;
inPst >> date::parse("%a, %d %b %Y %T %Z", tpPst);
std::cout << chrono::duration_cast<chrono::milliseconds>( tpPst.time_since_epoch() ).count() << std::endl;

istringstream inGmt{"Fri, 25 Sep 2020 13:44:43 GMT"};
std::chrono::time_point<std::chrono::system_clock, chrono::seconds> tpGmt;
inGmt >> date::parse("%a, %d %b %Y %T %Z", tpGmt);
std::cout << chrono::duration_cast<chrono::milliseconds>( tpGmt.time_since_epoch() ).count() << std::endl;
产生输出:
1601041483000
1601041483000
1601041483000
我是在做错什么,还是解析器未使用时区信息?

最佳答案

不幸的是,仅给出时区缩写,就无法可靠,唯一地标识时区。多个时区使用某些缩写,有时甚至使用不同的UTC偏移量。
简而言之,将解析时区缩写,但未标识可用于更改已解析时间戳的UTC偏移量。
请参阅Convert a time zone abbreviation into a time zone,以获取试图至少一次缩小使用特定时区缩写的时区的代码。
另外,如果您解析UTC偏移量("%z""%Ez"),则该偏移量将应用于时间戳,以将其转换为sys_time

首先,我通过find_by_abbrev重载了here描述的local_time重载来运行这三个示例。结果很有趣,因为它们很可能证实了解析时区缩写的脆弱性:

"Fri, 25 Sep 2020 13:44:43 EST"
可以是以下任何时区:
2020-09-25 13:44:43 EST 2020-09-25 18:44:43 UTC America/Atikokan 
2020-09-25 13:44:43 EST 2020-09-25 18:44:43 UTC America/Cancun
2020-09-25 13:44:43 EST 2020-09-25 18:44:43 UTC America/Jamaica
2020-09-25 13:44:43 EST 2020-09-25 18:44:43 UTC America/Panama
2020-09-25 13:44:43 EST 2020-09-25 18:44:43 UTC EST
所有这些都具有-5h的UTC偏移量。因此,从这个意义上讲,UTC等效项是唯一的(如上所示,2020-09-25 18:44:43 UTC)。但是,您必须怀疑是否真的打算使用America / Montreal,因为它在该日期的UTC偏移量为-4h,并且是EDT的缩写。
"Fri, 25 Sep 2020 13:44:43 PST"
只有一场比赛!
2020-09-25 13:44:43 PST 2020-09-25 05:44:43 UTC Asia/Manila
UTC偏移为8h。但是我想知道是否打算使用America / Vancouver,因为该日期的UTC偏移为-7h,并且是PDT的缩写。
如果知道要解析的缩写的匹配UTC偏移量,则可以将其解析为 local_time,解析该缩写,查找UTC偏移量,然后将其应用于将 local_time转换为 sys_time。该库使解析缩写和时间戳变得很容易:
local_seconds tpEst;
std::string abbrev;
inEst >> date::parse("%a, %d %b %Y %T %Z", tpEst, abbrev);
sys_seconds tpUTC{tpEst - local_seconds{} - get_offset(abbrev)};
其中 get_offset(abbrev)是您编写的自定义 map ,用于在给定时区缩写的情况下返回偏移量。请注意,如果打算使用EDT(-4h)但已解析EST(-5h),这将无济于事。
另一种可能的策略是将缩写映射到时区名称(而不是偏移量)。例如:“EST”和“EDT”都可以映射到“America / Toronto”,然后您可以执行以下操作:
local_seconds tpEst;
std::string abbrev;
inEst >> date::parse("%a, %d %b %Y %T %Z", tpEst, abbrev);
zoned_seconds zt{get_tz_name(abbrev), tpEst};
sys_seconds tpUTC = zt.get_sys_time();

关于c++ - 时区解析,包括时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64066275/

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