2013-09-08 3 views
0

속성이 when이고 duration 인 작업 모델이 있습니다.Ruby on Rails 시간대 이상한 동작

작업이 활성 상태인지 확인하여 페이지에 표시 할 수있는 방법을 썼습니다.

def active? 
    if (self.when + self.duration) > Time.now 
     true 
    end 
    end 

내가 개체 검사 콘솔에서 재판 :

t.when + t.duration 
=> Sun, 08 Sep 2013 01:01:00 UTC +00:00 
DateTime.now 
=> Sun, 08 Sep 2013 01:57:13 +0200 
t.active? 
=> true 

그것은 true의를하지만 duration 1:00 시간 1 분을 입력하고 나는 그것이 안 희망 이 활성화 방법 참된.

데이터베이스의 when 열이 올바른 시간대에 저장되지 않아 잘못된 결과가 표시되는 것으로 보입니다. 이 문제를 해결하는 방법?

+0

를? –

+0

필자는이 필드와 관련된 마이 그 레이션을 보여 주므로 정수로 저장됩니다. –

+0

'DateTime'에'60 '을 추가하면 어떻게됩니까? 콘솔에서'DateTime.now + 60'을 실행하고 타임 스탬프에'+60 '이 무엇인지보십시오. –

답변

1

이 데이터베이스에 열이 올바른 시간대

1) 레일에 저장되지 않을 때 자동으로 좋은 인 (데이터베이스에서 그들을 삽입하기 전에 UTC 시간에 시간을 변환 것으로 보인다 일)은 시간에 "+0000"의 오프셋이 있음을 의미합니다. 즉, 데이터베이스에 오후 8시를 저장하고 서버가 "+0600"오프셋을 갖는 시간대에 있으면 해당 UTC 시간은 오후 2시이므로 오후 2 시가 데이터베이스에 저장됩니다. 즉, 로컬 서버의 시간이 UTC 시간보다 6 시간 빠릅니다. 즉, 서버의 시간대가 오후 8 시가되면 UTC 시간대가 오후 2시입니다.

2) 날짜를 비교할 때 루비는 시간대 오프셋을 고려합니다. 즉, 루비는 모든 시간을 동일한 시간대로 변환 한 다음 시간을 비교합니다. 다음은 예제입니다.

2.0.0p247 :086 > x = DateTime.strptime('28-01-2013 08:00:00 PM +6', '%d-%m-%Y %I:%M:%S %p %z') 
=> Mon, 28 Jan 2013 20:00:00 +0600 
2.0.0p247 :087 > y = DateTime.strptime('28-01-2013 08:20:00 PM +7', '%d-%m-%Y %I:%M:%S %p %z') 
=> Mon, 28 Jan 2013 20:20:00 +0700 
2.0.0p247 :088 > x < y 
=> false 

두 Datetime 개체의 시간을 비교하면 x는 y보다 작습니다. 그러나 y는 오전 7시 20 분에 +6 오프셋이있는 시간대에서와 같은 +7 오프셋이있는 시간대에서 오후 8:20의 시간을가집니다. 따라서 y는 실제로 x보다 작습니다. 사과와 사과를 비교해야합니다. 즉, 동일한 시간대로 변환 된 시간을 정신적으로 비교해야 루비/레일과 동일한 결과를 얻을 수 있습니다. 당신은 레일 UTC를 (사용하여 UTC 시간에 Time.now을 변환 할 수 있습니다

3)) 방법 : 루비 시간을 비교하기 전에 무엇이다

2.0.0p247 :089 > x = Time.now 
=> 2013-09-07 8:00:00 +0600 
2.0.0p247 :090 > x.utc 
=> 2013-09-07 02:00:00 UTC 

.지금은 좀 더 편리하게 사용 원하는 시간과 날짜 시간 객체 생성 찾을 수 있습니다task.when + task.duration

4)에 : 당신은이 0으로 오프셋 지정할 수 있기 때문에

DateTime.strptime('28-01-2013 08:00:00 PM +0', '%d-%m-%Y %I:%M:%S %p %z' 

것은, 당신이 '돈을 UTC 시간으로의 변환을 예상하는 시간을 만들어야합니다.

아니면이() 시간 변환없이 변경 오프셋의 원인이되는 변화() 메소드를 사용할 수 있습니다은`duration` 당신이 "1 분"저장 않았다 어떻게

2.0.0p247 :011 > x = DateTime.now 
=> Sun, 08 Sep 2013 00:34:08 +0600 
2.0.0p247 :012 > x.change offset: "+0000" 
=> Sun, 08 Sep 2013 00:34:08 +0000 
+0

어떤 솔루션을 추천하십니까? 나는 그것이 왜 기본적으로 작동하지 않는지 궁금합니다. 내가 작동한다면 다른 서버 (예 : Heroku)로 마이그레이션 할 때 기본 표준 시간대를 변경하면 궁금합니다. –

+0

모든 것이 작동하지만, 어떻게 작동하는지 이해할 수 없습니다. 예를 들어 1/8 + 1/4를 추가하고 2/8을 얻으시겠습니까? 아니요, 추가하기 전에 1/8과 1/4을 공통 분모로 변환해야하므로 1/8 + 2/8 = 3/8이됩니다. 그것은 시대와 같습니다. 레일은 시간을 비교하기 전에 모든 시간을 공통 분모 UTC로 변환합니다. 그러나 당신은 당신의 시간에 정신적으로 그렇게하지 않습니다. 예를 들어 8pm의 시작 시간과 "+0000"의 오프셋이있는 작업이 있고 "+0200"오프셋이있는 오후 9 시가 오후 8시보다 커야한다고 생각하면 무시할 수 있습니다. 오프셋 (offset). – 7stud

+0

시간을 올바르게 비교하려면 오프셋을 고려해야하며 레일은이를 수행합니다. 'Time.now.utc'라고 쓰는 것은 정말로 어렵습니까? – 7stud