ActiveSupport :: TimeWithZone(和Time.zone)的方法应该尊重DST的变化吗?

时间:2014-11-05 10:52:43

标签: ruby-on-rails ruby time timezone

看看这段代码:

[4, 5, 6, 7].each do |x| 
  start_at = Time.zone.parse("2014.10.2#{x} 08:00")
  puts "#{start_at.inspect} / #{start_at.seconds_since_midnight/60}"
end

输出:

Fri, 24 Oct 2014 08:00:00 CEST +02:00 / 480.0
Sat, 25 Oct 2014 08:00:00 CEST +02:00 / 480.0
Sun, 26 Oct 2014 08:00:00 CET +01:00 / 480.0
Mon, 27 Oct 2014 08:00:00 CET +01:00 / 480.0

我们在德国,10月26日DST重置,所以08:00实际上不是午夜8 * 60分钟但是9 * 60。

恕我直言,这应该受到seconds_since_midnight方法的尊重。我错过了什么或者这实际上是一个Ruby错误吗?

在Mac OS X 10.9.5(MacPorts)上使用Ruby 1.9.3,Rails 3.0.20。

(是的,Rails 3.0.20已经过时了。遗留项目。如果在Rails 4中修复了,那就更好了。)

1 个答案:

答案 0 :(得分:2)

根据the Rails docs,它是这样实现的:

# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 14
def seconds_since_midnight
  sec + (min * 60) + (hour * 3600)
end

因此,此功能不能识别时区。它只是查看当地时间值。它不认为午夜的偏移量可能与您提供的值的偏移量不同。它也不认为午夜可能不存在于当地时区(例如巴西的春季前进过渡期)。

这是一个错误吗?也许。但人们也可能会说这种方法命名不佳。无论哪种方式,它都是Rails的问题,而不是Ruby。