我正在使用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
。似乎有问题。
答案 0 :(得分:6)
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日开始。请参见here和here。此更改已反映在IANA TZDB 2018a中,已反映在TZInfo-Data v1.2018.1中。如果您使用的是该版本或更高版本,那么您将拥有较新的正确的巴西夏令时日期,从而可以解释您的结果。
最近有一项计划将巴西的夏令时日期进一步推迟到11月18日,但是政府在该计划正式生效之前就撤回了该计划,因此从未在时区数据中显示。