2011-03-06 27 views
2

我遇到了一個關於Rails REST XML和日期時間值序列化的有趣問題。也就是說,日期時間值表示爲常量偏移值,如下所示:如何在REST XML Web服務中表示可變偏移時區?

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

請注意日期時間值加上-0500的常量偏移量。從這個REST Web服務中獲取信息時,這樣的偏移量可以很好地工作。但是,假設我想向這個Web服務發佈信息,並且我希望Rails能夠解釋夏令時,就像用戶提交Web表單時一樣。我發現我可以這樣做:

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

和時間將正確解釋爲本地用戶的time zone preference。事實上,這是一個常規的表單提交。到現在爲止還挺好。

還假設我需要能夠直接指定請求中的時區。原因在於特定用戶可能隨時更改他們的時區偏好,但代表他們的API請求總是位於固定位置(因此是固定時區)。

這看起來很簡單,但被少數因素而變得複雜:

  • 時區偏移一般一年更換兩次(即從-0500至-0400和背面)。
  • Rails總是期望恆定的時區偏移或日期時間將被解釋爲本地時間(或用戶的時區偏好)。
  • Ruby's Time類不理解可變偏移量。例如,我可以指定時間爲東部標準時間(東部標準時間)或東部夏令時(東部夏令時間),但Time.parse將無法​​正確理解「東部時間」或ET。我無法詳細說明其中的一種,因爲這會導致時間在一年半時間內關閉。

我已經考慮了以下解決方案:

  1. 一個TIME_ZONE虛擬屬性添加到模型。我不喜歡這樣,因爲它在模型的上下文中沒有什麼意義,並且時區的設置很容易出現參數分配問題(例如,當time_zone在日期之前處理時,模型必須表現出不同的行爲日期和time_zone爲零時)。

  2. 使用與POST的XML數據關聯的查詢字符串參數。許多人似乎對HTTP POST請求中使用的查詢字符串不滿,甚至popular rest clients不需要seem 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,postgres? – stef 2011-03-06 07:51:49

回答

0

如果您使用的ActiveRecord與Postgres的,你會先設置你的數據庫的倍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中正確表示時區。 Rails通過表單urlencoded參數(即普通POST)處理這種情況,但沒有真正的工具可以對XML甚至JSON進行相同操作。 – adamlamar 2011-03-06 23:41:40