2011-03-10 47 views
0

我的rails 3應用程序需要與外部web服務進行交互。這個網絡服務提供有關整個美國雨天活動的信息(最終這個國家並不重要)。相關信息是開始/結束時間,格式爲ISO8601,包括時區。服務器將運行在美國的東海岸(所以EST即將成爲美國東部時間)。所有數據庫條目都將存儲爲UTC。如何捕獲iso8601 datetime的原始時區?

我需要能夠存儲事件發生的時區(TZ),因此我向用戶提供選項以查看他們自己的TZ或原始TZ中的事件。一旦他們到達該位置,他們將不會在乎該事件是否基於他們的HOME TZ而開始,但是事件將發生在TZ。

輸入數據:

start = "2011-04-08T10:00:00-06:00" 
    end = "2011-04-08T16:00:00-06:00" 

#fyi 
Time.zone => GMT-05:00 Eastern Time US Canada 

# Server time zone, original time zone lost !!!! 
Time.parse(start) => 2011-04-08 12:00:00 -0400 

# UTC, time zone lost 
Time.zone.parse("2011-04-08T10:00:00-06:00") => Fri, 08 Apr 2011 16:00:00 UTC 00:00 

我沒有看到任何方式(減去人工字符串處理),以獲得原始,-06:00 TZ(MST)。我真的希望有一個RoR的方式獲得這個信息......似乎應該有一種方式!

回答

0

如果使用Time你會失去信息,但如果您使用DateTime你將被罰款:

DateTime.parse("2011-04-08T10:00:00-06:00") 
# => Fri, 08 Apr 2011 10:00:00 -0600 

DateTime類比Time更強大,可以編碼更多的信息,雖然是慢和更多的記憶飢餓。幸運的是,除非您花費大部分時間在大批量操作中操作像這樣的值,否則性能不會成爲問題。

+0

完美!使用區域和偏移量方法,我可以得到我所需要的。不知道爲什麼我沒有找到這個...日期/時間+ TZ在ruby和rails中看起來像一團糟。 – basszero 2011-03-10 14:21:04

+0

因爲這是一個複雜的問題,所以我用過的每種語言都很混亂。 – tadman 2011-03-10 18:35:07

+1

責怪政治家,而不是圖書館。 – hoffmanc 2012-10-04 14:32:39