日付を UTC UNIX タイムスタンプ整数として読み取る必要があります。そして、それを使用して、日付計算を行います。
Rails アプリケーションと環境を模倣する仕様を作成しました。
https://github.com/dlikhten/semaphoretests/blob/master/spec/time/test_time.rb
require 'spec_helper'
describe "time testing" do
base_time = Time.new("2012")
8760.times do |n|
context "#{n + 1} hour offset" do
let(:now) { base_time + (n + 1).hours }
before { Timecop.freeze(now) }
after { Timecop.return }
it do
# puts now.to_s
t1 = 30.days.from_now.utc.to_i
# puts t1
d1 = Time.at(t1).to_date
# puts d1
d2 = 30.days.from_now.to_date
# puts d2
# puts 30.days.from_now.to_date
d1.should == 30.days.from_now.to_date
d2.should == 30.days.from_now.to_date
d1.should == d2
end
end
end
end
この仕様が失敗する理由を誰か教えてもらえますか? これは、1 年のすべての時間に対してロジックを実行しようとします。数時間で失敗します。
興味深いのは、1日に数回、1日オフの計算を取得することです. なぜこれが起こるのか意味がありません。生成されたすべての日付が同一のタイムスタンプになるように、Timecop.freeze を実行していることに注意してください。
理論的には、すべてのインスタンスで正しいタイムゾーンで動作するはずです。
ルビー 1.9.2 レール 3.2.6