微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

时区解析,包括时区

如何解决时区解析,包括时区

我正在使用@ 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,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,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"),则该偏移量 将应用于时间戳,以将其转换为{{1 }}。


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

local_time

可以是以下任何时区:

"Fri,25 Sep 2020 13:44:43 EST"

所有这些的UTC偏移量为-5h。因此,从这个意义上讲,UTC等效项是唯一的(如上所示,2020-09-25 18:44:43 UTC)。但是,人们不得不怀疑是否真的打算使用America / Montreal,因为它在该日期的UTC偏移量为-4h,并且是EDT的缩写。

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 

只有一场比赛!

"Fri,25 Sep 2020 13:44:43 PST"

这具有8h的UTC偏移量。但是我想知道是否打算使用美国/温哥华,因为它在该日期的UTC偏移为-7h,并且是PDT的缩写。

如果知道要解析的缩写的匹配UTC偏移量,则可以解析为2020-09-25 13:44:43 PST 2020-09-25 05:44:43 UTC Asia/Manila ,解析缩写,查找UTC偏移量,然后将其转换为local_time变成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)}; 是您编写的自定义映射,用于在给定时区缩写的情况下返回偏移量。请注意,如果打算使用EDT(-4h)但解析了EST(-5h),这将无济于事。

另一种可能的策略是将缩写词映射到时区名称(而不是偏移量)。例如:“ EST”和“ EDT”都可以映射到“ America / Toronto”,然后您可以执行以下操作:

get_offset(abbrev)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。