【问题标题】:convert current server time to timezone using dst with boost使用带有 boost 的 dst 将当前服务器时间转换为时区
【发布时间】:2016-04-10 07:31:06
【问题描述】:

如何获取我的 linux 服务器的当前时间并将其转换为 boost c++ 中的给定时区(例如 MST-7)? 我希望自动计算夏令时。

如果我运行以下代码,则不考虑 dst:

 boost::posix_time::ptime currentTime = boost::posix_time::second_clock::local_time();
 date today = day_clock::local_day();
 time_zone_ptr phx_tz(new posix_time_zone("MST-07:00:00"));
 local_date_time phx_departure(currentTime, phx_tz);

【问题讨论】:

    标签: c++ boost timezone dst


    【解决方案1】:

    这个问题的真正答案是:不要

    我会引用Daylight saving time and time zone best practices的回答:

    考虑到 Boost 时区文件的最后一次提交日期为 2011 年 6 月 24 日,因此即使他们拥有设计不佳的 API 和实现,它甚至无法满足自己的承诺,因为它没有任何了解过去 5 年的时区变化!

    此外,您真的不应该使用 POSIX 时区。他们有很多的不足,应该劝阻。请参阅the timezone tag wiki 中有关 POSIX 时区的部分。相反,您应该使用正确的 IANA/Olson 时区标识符,对于美国山区时区(使用 DST),该标识符为 America/Denver,对于不使用 DST 的亚利桑那州部分,则为 America/Phoenix

    【讨论】:

    • 感谢您的重播。我正在考虑使用 ICU 库而不是 boost。你熟悉吗?我关心的是如何获得时区的自动更新。你知道它是否足以通过 linux 更新来更新 zoneinfo 目录,还是我需要更新 ICU 库? ICU 是否直接从 /usr/share/zoneinfo 加载时区?
    • 如果您不需要本地化,只需要 tz 转换,您可能最好使用 cctz 或 hh 的 lib。不确定您的具体问题。阅读文档或尝试一下,或在此处提出新问题。
    【解决方案2】:

    您可以在 time_zone 定义中指定 DST 信息:

    time_zone_ptr phx_tz(new posix_time_zone("MST-07MDT01:00:00,M3.2.0/02:00:00,M11.1.0/02:00:00"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2012-10-21
      相关资源
      最近更新 更多