我遇到了一個關於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。我無法詳細說明其中的一種,因爲這會導致時間在一年半時間內關閉。
我已經考慮了以下解決方案:
一個TIME_ZONE虛擬屬性添加到模型。我不喜歡這樣,因爲它在模型的上下文中沒有什麼意義,並且時區的設置很容易出現參數分配問題(例如,當time_zone在日期之前處理時,模型必須表現出不同的行爲日期和time_zone爲零時)。
使用與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>
只是在一個答案工作。你的後端是什麼? Mysql,postgres? – stef 2011-03-06 07:51:49