似乎已经成为我的风格,我正在回答我自己的问题。
由于跨 DST / ST 的转换相当罕见(在世界许多地方,不存在),更有效的方法是首先添加 (n_days * 24 * 60 * 60) 秒,然后检查 UTC 偏移量是否已更改。如果有,则创建一个更正的时间对象。
像这样:
def add_days(time, n_days)
t2 = time + (n_days * 24 * 60 * 60)
utc_delta = time.utc_offset - t2.utc_offset
(utc_delta == 0) ? t2 : t2 + utc_delta
end
这种方法避免了许多额外的对象创建,并正确处理夏令时之间的转换(至少在我当前的时区,太平洋时间):
>> t1 = Time.new(2013, 3, 10, 0, 0, 0)
=> 2013-03-10 00:00:00 -0800 # midnight Mar 3, 2013 Pacific Standard Time
>> t2 = add_days(t1, 1)
=> 2013-03-11 00:00:00 -0700 # midnight Mar 4, 2013 Pacific Daylight Time
>> t2 - t1
=> 82800.0 # a shorter than usual day
>> u1 = Time.new(2013, 11, 3, 0, 0, 0)
=> 2013-11-03 00:00:00 -0700 # midnight Nov 3, 2013 Pacific Daylight Time
>> u2 = add_days(u1, 1)
=> 2013-11-04 00:00:00 -0800 # midnight Nov 4, 2013 Pacific Standard Time
>> u2 - u1
=> 90000.0 # a longer than usual day