0

日付を 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

4

1 に答える 1

0

to_iに置き換えますto_f

小数秒の切り捨てが違いを生んでいる可能性があります。なぜそうなるのかはわかりません。

または、ループ内で呼び出す代わりに、to_fパフォーマンスを向上させるために、次の部分を切り捨てますbase_time

base_time = Time.at(Time.new('2012').to_i)
于 2012-09-14T22:20:24.037 に答える