2011-02-04 5 views
3

長い間、私はこの問題を抱えていました。その日の特定の時間に、私のテストのトンが壊れてしまいました。私は単純な日付比較をしている多くのテストをしており、すべてが深夜から午後4時のようにうまく動作します。なぜこれが起こっているのか?自分のタイムゾーンも自分の環境ファイルに設定しました。時間関連のユニットテストが毎日午後4時に中断するのはなぜですか?

5.days.from_now.to_dateのような私の呼び出しのいくつかは余分な日を追加しているようです。

編集例えば

、このテストは失敗します。

# Widget that creates items for how many days the trip is gone. 
def test_should_create_correct_amount_of_days_for_trip 
    w = DayWidget.create(:trip => trips(:hawaii)) 
    assert_equal w.days.size, 5 
end 

# Code in trip model that calculates amount of days 
def number_of_days 
    (self.return_date.to_date - self.depart_date.to_date).to_i + 1 
end 

# Test fixture yaml for Hawaii 
hawaii: 
    depart_date: <%= Time.now.tomorrow.to_s(:db) %> 
    return_date: <%= 5.days.from_now.to_s(:db) %> 

午後4:00後、試験は上記失敗し、それが作成したと言う6日間の代わりに、5 :(

答えて

8

ますおそらく、太平洋標準時間帯のUTCよりも8時間遅れているでしょう(これは、UTCの深夜に達するので、4時00分に開始します)。

テスト/比較コードが表示されていないと、あなたが日付/時刻を同じ場所(UTCかUTCか地元のローカルタイムか)と比較していることを確認することです。

更新:XXX.days.from_nowを使用すると、タイムゾーンの異なる扱いで、その結果、ActiveSupport::TimeWithZoneオブジェクトを返すのに対しTime.nowは、Timeオブジェクトを返すように[OK]を、それが見えます:

ruby-1.9.2-p136 :009 > (Time.now+5.days).to_s(:db) 
=> "2011-02-08 19:40:24" 
ruby-1.9.2-p136 :010 > 5.days.from_now.to_s(:db) 
=> "2011-02-09 03:40:29" 

私の推薦をすることのいずれかに.utcを呼ぶだろう次のようなあなたの時間:

ruby-1.9.2-p136 :017 > 5.days.from_now.utc.to_s(:db) 
=> "2011-02-09 03:42:39" 
ruby-1.9.2-p136 :018 > (Time.now+5.days).utc.to_s(:db) 
=> "2011-02-09 03:42:39" 

タイプを一貫性を保つためにTime.now.tomorrowの代わりにを使用してください。

+0

ええ、すべてが正しく比較されているようです。私はちょうど例を示すために自分の投稿を編集しました。ありがとう – CalebHC

+0

私の更新された答えを見てください... 'Time.now'は' 5days.from_now'とはまったく異なるクラスタイプを返します。 –

+0

ありがとうございました!これは私のコードでは間違いなく問題でした。私はオブジェクトが返されていたときとは別のことを知らなかった。問題は今、私がコードベースに時間と空間のオブジェクトが混在していることです(Time.nowと1.day.ago)。私は一貫性のために毎回オブジェクトに.utcを適用するか、それとも過剰なものですか? – CalebHC

0

日にちを本当に扱っている場合は、時間、分、秒を0に設定してください。そうしないと、日付を作成する時刻があいまいになります。

+0

データベースまたは私の比較でそれらを0に設定しますか? – CalebHC

+0

Dateオブジェクトを作成するときにゼロに設定します。 –

1

Time.nowの代わりにTime.currentを使用することもできます。

Time.currentは、#ago#from_nowと同じように返されるため、返された日付を安全に比較できます。

関連する問題