2011-03-06 2 views
2

레일즈 REST XML과 datetime 값의 직렬화 방식에 관한 흥미로운 문제가 생겼습니다.REST XML 웹 서비스에서 가변 오프셋 시간대를 나타내는 방법은 무엇입니까?

<model> 
    <date type="datetime">2010-07-21T16:38:03-05:00</date> 
</model> 

주 시간 값 더하기 -0500 오프셋 전율 : 즉, 시간 값은 다음처럼 일정한 오프셋 값으로 표현된다. 이 REST 웹 서비스에서 정보를 소비 할 때 이러한 오프셋은 완벽하게 작동합니다. 그러나이 웹 서비스에 정보를 POST하고 싶다고 가정하고 사용자가 웹 양식을 제출할 때와 같이 Rails에서 일광 절약 시간을 고려하기를 원했습니다. 나는이 작업을 수행 할 수 있습니다 발견했습니다

<model> 
    <date type="datetime">2010-07-21 16:38:03</date> 
</model> 

와 시간이 제대로 해석됩니다 로컬 사용자의 time zone preference. 실제로 이것은 정규 양식 제출과 관련하여 일어나는 일입니다. 여태까지는 그런대로 잘됐다.

요청에 시간대를 직접 지정할 수있는 기능이 필요하다고 가정 해보십시오. 특정 사용자는 언제든지 표준 시간대 환경 설정을 변경할 수 있지만 대신에 오는 API 요청은 항상 고정 된 위치 (따라서 고정 된 시간대)에 있습니다.

이는 간단한데,하지만 몇 가지 요인에 의해 복잡 :

  • 시간대 오프셋은 일반적으로 (즉 -0500에서 다시 -0400과에) 년에 두 번 변경합니다.
  • 레일즈는 항상 일정한 시간대 오프셋을 필요로하거나 datetime이 현지 시간 (또는 사용자의 시간대 환경 설정)으로 해석됩니다.
  • Ruby의 Time 클래스는 가변 오프셋을 인식하지 못합니다. 예를 들어, 동부 표준시 (EST) 또는 동부 일광 절약 시간 (EDT)을 지정할 수 있지만 Time.parse은 "동부 표준시"또는 동부 표준시를 제대로 이해하지 못합니다. 시간이 1 시간 반 정도 떨어져 있기 때문에 하나 또는 다른 것을 지정할 수 없습니다.

가 나는 다음과 같은 솔루션을 고려했습니다

  1. 는 모델에 TIME_ZONE 가상 속성을 추가합니다. 나는이 모델의 맥락에서 의미가 거의 없기 때문에 이것을 좋아하지 않는다. 시간 영역의 설정은 매개 변수 할당에 문제가 생기기 쉽다. (즉, 모델은 time_zone이 날짜 이전에 처리 될 때 다른 행동을 보여야한다. 날짜, time_zone이 nil 일 때).

  2. POST 된 XML 데이터와 관련하여 쿼리 문자열 매개 변수를 사용하십시오. 많은 사람들이 HTTP POST 요청에 사용되는 쿼리 문자열에 눈살을 찌푸린 것처럼 보이며 popular rest clientsseem to support it이 아닙니다.

이 문제에 대한 가능한 다른 해결책이 있습니까? 나는이 같은 변수 오프셋을 지정할 수 싶지만 그들 중 누구도 작동하지 :

<date>2010-07-21 16:38:03 Eastern Time</date> 
<date>2010-07-21 16:38:03 Eastern Time (US & Canada)</date> 
<date>2010-07-21 16:38:03 ET</date> 
<date>2010-07-21 16:38:03 America/New York</date> 
+0

답변 만하고 있습니다. 백엔드는 무엇입니까? MySQL, 포스트그레스? – stef

답변

0

당신은 포스트 그레스와 액티브를 사용하는 경우, 먼저 timezones와 시간을 저장하는 데이터베이스를 설정하는 것입니다,하지만 당신은 '돈 경우 실제로 영역에 대해 신경을 쓰지 만, 접근 방식이 UTC로 항상 저장 될 수있는 정확한 시간을 원한다. 즉, 제출 된 시간을 적절하게 구문 분석해야한다는 것을 의미합니다.

UTC로 구문 분석하는 예제입니다.

require 'time' # there is a gotcha here - make sure you have this line 

Time.parse("2011-03-01 01:00:00 EST").utc 
=> Tue Mar 01 06:00:00 UTC 2011 

Time.parse("2011-03-01 01:00:00 GMT").utc 
=> Tue Mar 01 01:00:00 UTC 2011 

구문 분석 된 시간에는 세 문자 코드로 시간대가 포함됩니다. 그렇지 않은 경우 서버의 환경 설정을 사용합니다. 영역이 포함되지 않은 경우 수행 할 작업을 결정하기 위해 여기에서 몇 가지 작업을 수행 할 수 있습니다. 거기에 문자열을 파싱 중입니다.

.utc 메서드 호출은 구문 분석 된 표준 시간대를 UTC로 변환하므로 데이터가 데이터베이스에 도달하면 모든 시간이 동일한 형식으로 저장됩니다.

+0

귀하의 의견에 감사드립니다. 그러나 데이터베이스와의 시간차를 나타내는 데 문제가 없습니다. 나는 모든 것을 UTC로 저장하고 사용자 시간대 환경 설정에 따라 앞뒤로 변환합니다. 문제는 XML 기반 REST API에서 표준 시간대를 올바르게 나타내는 것입니다. 레일스는이 urlencoded 매개 변수 (즉, 일반 POST)를 사용하여이 사례를 잘 처리하지만 XML 또는 JSON에서도 동일한 기능을 수행 할 실제 기능이 없습니다. – adamlamar

관련 문제