看看这段代码:
[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中修复了,那就更好了。)
答案 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。