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

时间:2018-10-18 17:24:29

标签: ruby-on-rails ruby timezone ruby-on-rails-5

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

现在是巴西的冬天(无夏令时),所以

Time.current.dst?返回false

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

(Time.current + 10.days).dst?我希望它返回true,但它返回false

是否有一张桌子可以检查Rails考虑的开始日期和每个时区的夏令时?

或作为另一个示例。我了解UTC没有夏令时。所以

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

但是当我这样做

(Time.current+10.days).strftime(%Z)仍然返回-3,但是该日期是巴西更改时间之后的日期,因此应该为-2。似乎有问题。

1 个答案:

答案 0 :(得分:6)

the Rails documentation

  

TimeZone类充当TZInfo::Timezone实例的包装。

TZInfo::Timezone实例是通过Ruby TZInfo gem提供的。 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日开始。请参见herehere。此更改已反映在IANA TZDB 2018a中,已反映在TZInfo-Data v1.2018.1中。如果您使用的是该版本或更高版本,那么您将拥有较新的正确的巴西夏令时日期,从而可以解释您的结果。

最近有一项计划将巴西的夏令时日期进一步推迟到11月18日,但是政府在该计划正式生效之前就撤回了该计划,因此从未在时区数据中显示。