2012-09-14 2 views
0

날짜를 UTC 유닉스 타임 스탬프 정수로 읽어야합니다. 그런 다음 그것을 사용하여 날짜 계산을하십시오.Ruby/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 일 계산이 중단된다는 것입니다. 왜 이런 일이 발생하는지 이해가되지 않습니다. 생성 된 모든 날짜가 동일한 타임 스탬프인지 확인하기 위해 Timecop.freeze를 수행합니다.

이론적으로 모든 인스턴스에서 올바른 시간대로 작동해야합니다.

루비 1.9.2 레일 3.2.6

+0

? 어쩌면이 건축은 많은 기억을 소비합니까? – megas

+0

Timecop.return의 의미는 무엇입니까? return은 키워드이고 메서드는 될 수 없습니다. – megas

+0

@megas'return' *는 명시적인 리시버로 항상 호출되는 한 메서드 이름으로 사용할 수 있습니다. – Kelvin

답변

0

to_ito_f로 교체합니다.

부분적 두 번째 잘림이 차이를 만들 수 있습니다. 왜 그렇게 될지 모르겠다.

또는 대신 더 나은 성능을 위해, 루프로하여 base_time에서 일부 to_f을 들어온다 호출 : 어떤 메모리에 대한

base_time = Time.at(Time.new('2012').to_i) 
관련 문제