2011-04-08 5 views
0

Redmine 때문에 이전 레일 버전을 사용하고 있습니다.Rails 2.3.5에서 날짜가 일관성없이 해석됩니다.

Redmine의 데이터베이스 덤프 타임 스탬프를 특정 시간대로 업데이트하는 스크립트를 작성하려고합니다. 따라서 레일스가 dst 경계를 처리 할 수 ​​있다고 가정 할 때 루비를 구문 분석하고 시간대를 변경해야합니다.

그럼에도 불구하고 Time.parse가 작동하는 방식에 일관성이 없거나 잘못 이해되었습니다.

[email protected]:~/pgtz_converter$ script/console 
Loading development environment (Rails 2.3.5) 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0> 
>> Time.parse('2011-02-19 23:00:00') 
=> Sat Feb 19 23:00:00 -0200 2011 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0> 
>> Time.parse('2011-02-20 00:00:00') 
=> Sun Feb 20 00:00:00 -0300 2011 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0> 
>> Time.parse('2011-02-19 23:00:00') 
=> Sat Feb 19 23:00:00 -0300 2011 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x7fa94a57b9a8 @tzinfo=nil, @name="UTC", @utc_offset=0> 
>> exit 

여기 위에서 벌어지고있는 작업은 다음과 같습니다 :

서버 지역 날짜 영역 BRT입니다

여기 내 레일에 2.3.5 원시 응용 프로그램을 실행 한 스크립트입니다.

[email protected]:~/pgtz_converter$ date 
Fri Apr 8 19:17:34 BRT 2011 

먼저 Time.zone (UTC)을 확인한 다음 DST 날짜를 구문 분석합니다. 출력이 양호합니다. DST가 켜져 있습니다 (Time.zone = UTC는 Ruby가 서버 영역 구성을 검사하여 사용했음을 의미합니다). 그런 다음 DST가 더 이상 활성화되지 않은 다른 날짜를 시도합니다 (DST는 02/20/2011 00:00에 종료되었습니다). 이 날짜는 올바르게 구문 분석됩니다 (GMT-3).

이제 문제가 시작됩니다.

이전 DST 날짜를 다시 구문 분석하려고 시도하지만 결과가 잘못되었습니다. DST 날짜로 읽지 않았습니다!

아마도 파싱이 Time.zone을 변경했다고 생각했지만 붙여 넣기는 항상 UTC입니다.

이 문제의 원인은 무엇입니까?

읽어 주셔서 감사합니다.

닐로

답변

0

당신은 레일에 ActiveSupport :: TimeWithZone 클래스를 사용하여 변경할 수 있습니다.

+1

감사합니다.이 변경 사항은 트릭을 수행했습니다. 'Time.zone ='브라질리아 '및'Time.zone.parse ('날짜'). utc' \ o / – Niloct

관련 문제