代码之家  ›  专栏  ›  技术社区  ›  almo

Rails在哪里存储夏令时的开始和结束日期?

  •  3
  • almo  · 技术社区  · 6 年前

    我正在使用Rails 5,我的应用程序的时区设置为巴西利亚。

    现在巴西是冬天(没有日光节约),所以

    Time.current.dst? 收益率 false

    但是在巴西,夏令时从2018年10月21日开始,所以当我这样做的时候

    (Time.current + 10.days).dst? 我期待它回来 true 但是它回来了 .

    是否有一个表可以让我检查Rails在每个时区考虑的开始和结束日期以及夏令时?

    或者作为另一个例子。我知道UTC没有夏令时。所以

    Time.current.strftime(%Z) 返回 -3 这是UTC和当前巴西时间之间的正确差异。

    但当我这样做

    (Time.current+10.days).strftime(%Z) 仍然是回报 - 3 但那个日期是在巴西改变了时间之后,所以应该是 -2 . 好像出了什么问题。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Matt Johnson-Pint    6 年前

    the Rails documentation :

    TimeZone类用作包装 TZInfo::Timezone 实例。

    TZINFO::时区 实例通过Ruby提供 TZInfo 宝石。TZINFO的数据单独提供 TZInfo-Data package . 保持最新状态将保持时区数据的准确性。此数据来源于 the IANA time zone database (TZDB) 与大多数其他编程语言一样。

    请注意,通常最好直接将IANA时区标识符与TZINFO GEM一起使用,因为Rails时区仅限于“134个区域中有意义的子集”(根据相同的文档),但包含许多重复和遗漏,并且不提供“有意义”的含义标准。更多关于这个 the timezone tag wiki (接近尾声)。

    此外,巴西将于2018年11月4日开始DST,而不是10月21日开始。 here here . 这一变化反映在 IANA TZDB 2018a 这反映在 TZInfo-Data v1.2018.1 . 如果您有那个版本或更新的版本,那么您就有更新的、正确的巴西DST日期,从而解释您的结果。

    最近有一项计划将巴西的夏令时延长至11月18日,但政府在正式公布之前撤销了该计划,因此在时区数据中从未出现过。