2013-10-07 2 views
1

나는 & 번 저장해야하는 응용 프로그램을 만들고 있습니다. 현재 다음과 같은 시간을 만듭니다.일광 절약 시간제 저장 방법

Time.strptime("2013-12-08 04:15pm PST", "%Y-%m-%d %H:%M%P %Z") 
=> 2013-12-09 00:15:00 +0000 

데이터베이스에 저장하는 것이 좋습니다.하지만 제 질문은 일광 절약 시간에 대한 것입니다. 이 작업을 수행 할 때 :

Time.strptime("2013-06-08 04:15pm PST", "%Y-%m-%d %H:%M%P %Z") 
=> 2013-06-09 00:15:00 +0000 

일광 절약 시간제로 조정되지 않은 것 같습니다. 나는 이것을 잘못 생각하고 있는가? 나중에 정확한 시간을 검색 할 수있는 시간 속성을 가진 객체를 만들 때 어떻게 알 수 있습니까?

사용자의 문자열 날짜를 가장 잘 읽고 데이터베이스의 utc에 저장 한 다음 나중에 DST 걱정없이 정확하게 표시하려면 어떻게해야합니까?

많은 답변이 레일스에서 ​​config.time_zone을 사용한다고하지만, 내 응용 프로그램은 결국 교차 시간대가 될 것입니다.

+0

하지만 읽을 user2''시간대에 가정하자'user1' 게시물 뭔가를 할 수 있습니다 및 다른 시간대에서. 'user1' 시간대로 시간을 절약 할 수 있습니다. 단지 +0으로 표준화하십시오. 어느 쪽이든,'user2' 설정에 따라 수동으로 시간대를 조정해야합니다. 시간대를 자동으로 처리하는 더 좋은 방법이 있는지 잘 모르겠습니다. – fotanus

답변

1

알아 냈어. PDT와 태평양 표준시의 차이점을 지적 해 주신 @MarkLakata에게 특별히 감사드립니다. 우리는 이들을 날짜에 사용하는 것에 의존 할 수 없다는 것을 알고 있습니다. 내 애플 리케이션에서, 나는 비록 나의 재산의 지리적 위치를 알고있다. 지금은 "태평양 표준시 (US & 캐나다)"이지만 나중에 다른 많은 위치의 숙박 시설을 보유하고있을 수 있습니다. 앞으로 청소 계획을 세우고 싶습니다. 현실 세계에서 사람들은 일반적으로 DST 주변을 재조정하지 않습니다. 따라서 오후 4시 15 분에 뭔가하고 있다고 말하면 DST인지 여부와 같은 의미이며, 앱이 동일한 방식으로 작동해야합니다.

property.timezone 
=> "Pacific Time (US & Canada)" 

Time.zone = property.timezone 
=> "Pacific Time (US & Canada)" 

time = Time.zone.parse("2013-12-08 04:15pm").utc 
=> 2013-12-09 00:15:00 UTC 

time = Time.zone.parse("2013-10-08 04:15pm").utC#DST 
=> 2013-10-08 23:15:00 UTC 

내 Cleaning_date 속성을 Heroku의 PostgreSQL DateTime 필드에 저장합니다. 나는 프론트 엔드에서 파싱 한 후에 그것을 저장할 수 있기 때문에 프로퍼티의 시간대를 알고 있습니다.

property.update(:cleaning_time => time) 

다시 데이터베이스에서 그걸 얻기 위해, 난 그냥 이렇게 :

def cleaning_date_string 
    self.cleaning_time.in_time_zone("Pacific Time (US & Canada)").strftime("%m/%d/%Y") 
end 

def cleaning_time_string 
    self.cleaning_time.in_time_zone("Pacific Time (US & Canada)").strftime("%l:%M%P") 
end 

불행하게도,이 내가 데이터베이스의 정확한 시간을 저장하고 동일한를 검색 할 수있는 유일한 방법입니다 방법. 이것은 로컬 및 Heroku에서 작동하는 것 같습니다.

추가 :
이에 따라 스레드 안전을 것 같다 : 나는 당신이 달성하려는 모르겠어요 Setting Time.zone during a request: Thread Safe?

+0

중요한 포인트를 쳤습니다. * UTC가 현지 시간 + 시간대 쌍만큼 중요하지 않은 경우 * 미래 * 일정을 계획하고 있습니다. [이 답변] (http://stackoverflow.com/a/19170823/634824)도 자바 개발자를위한 것이 었습니다. –

2

태평양 표준 시간입니다. 서머 타임을 원하면 문자열은 PDT입니다. 내 생각에 을 PDT으로 변환하면 원하는대로 처리 할 수 ​​있습니다.

# this is summer (PDT) 
Time.strptime("2013-06-08 04:15pm PDT", "%Y-%m-%d %H:%M%P %Z") 

# this is winter (PST) 
Time.strptime("2013-12-08 04:15pm PST", "%Y-%m-%d %H:%M%P %Z") 
+0

'Time.strptime ("2013-06-08 04:15 pm PDT", "% Y- % m- % d % H : % M % P % Z") ' => 2013-06-08 23 : 15:00 +0000 'Time.strptime ("2013-12-08 04:15 pm PDT", "% Y- % m- % d % H : % M % P % Z") ' => 2013 -12-08 23:15:00 +0000 –

+1

나는 어느 나라 출신인지 잘 모르겠지만 실리콘 밸리의 여름철은 PDT이고 겨울철은 PST입니다. Time.strptime ("2013-06-08 04:15 pm PDT", "% Y- % m- % d % H : % M % P % Z")'및'Time.strptime ("2013-12- 08 04:15 pm PST ","% Y- % m- % d % H : % M % P % Z ") ' –

+0

나는 그것이 어떻게 작동하는지보고, 나는 이전에 이해하지 못했다. 그러나 나는 사용자가 "2013-12-08 04:15 pm"을 얻고 있으며 주소가 어디인지 알기 때문에 PDT/PST 부분을 파악할 수있는 방법을 찾고 있습니다. 그래서, 주소에서 나는 "태평양 표준시 (미국과 캐나다)"부분을 얻을 수 있습니다. 다음으로 DST가 제공 한 날짜인지 여부를 알아야합니다. 이것은 나를 위해 이것을하는 방법이 있어야하는 것처럼 느껴지기 때문에 내 마음을 아프게합니다. –

0

시간대 약어를 사용해서는 안됩니다. 그들은 인간에게 유용 할 수 있지만 컴퓨터에서는 끔찍한 존재입니다. 예를 들어 "중부 표준시"는 "중부 표준시"를 의미 할 수 있으며 미국에 있다면 그 의미를 알 수 있습니다. 그러나 "중국 표준시"또는 "쿠바 표준시"를 의미 할 수도 있습니다. 표준 시간대 약어 here의 합리적으로 좋은 목록이 있으며, 중복이 있음을 분명히 보여줍니다. 이 목록조차 공식에 근거하지 않습니다.

"PST"대신 IANA "America/Los_Angeles"또는 Rails "Pacific Time (US & 캐나다)"과 같은 시간대 식별자를 사용해야합니다.

사용자 정의 표준 시간대가있는 레일즈 ActiveSupport::TimeZone을 사용할 수 있습니다. 또는 더 보편적 인 표준을 선호하는 경우 IANA 영역 식별자를 사용하는 TZInfo Ruby Gem을 사용해야합니다.

관련 문제