2013-10-07 48 views
1

我正在創建一個應用程序,需要日期&次存儲。目前,我創建一個時間是這樣的:如何存儲夏令時調整的utc時間

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 

它似乎沒有調整自己的夏時制。我在想這個錯誤嗎?我如何知道,當我創建一個具有time屬性的對象時,我將能夠在將來檢索確切的時間?

如何從用戶中最好地讀取字符串日期,並將其保存在數據庫中的utc中,並稍後檢索它以準確顯示而不用擔心DST?

我知道很多答案說在rails中使用config.time_zone,但我的應用程序最終會跨時區。

+0

我不知道你想達到什麼目的,但讓一個時區假設'user1'發佈內容並'user2'閱讀它在另一個時區。您可以使用'user1'時區節省時間,只需將其標準化爲+0即可。無論哪種方式,您都需要根據'user2'配置手動調整時區以顯示給他。我不確定是否有更好的方法來自動處理時區。 – fotanus

回答

1

想通了。特別感謝@MarkLakata指出了PDT和PST之間的差異。原來,我們不能依靠這些玩日期。在我的應用程序中,我確實知道屬性的地理位置。目前,它是「太平洋時間(美國&加拿大)」,但後來我可能會有許多其他地點的房產。我想安排未來的清潔工作。在現實世界中,人們通常不會重新安排夏令時。所以如果我說我在下午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),它涉及這些方面,但是針對Java開發人員。 –

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

我現在看它是如何工作的,以前我不明白。但是,我正在尋找一種方法來找出PDT/PST部分,因爲我只是從用戶那裏得到「2013-12-08 04:15 pm」,並知道他們的地址在哪裏。所以,從地址我可以得到「太平洋時間(美國和加拿大)」的一部分。接下來,我需要找出他們提供的日期是否爲DST。這是我心中的打擊,因爲我覺得應該有一種方法可以爲我做到這一點。 –

0

您不應該依賴時區縮寫。它們可能對人類有用,但對計算機來說它們很可怕。例如,「CST」可能意味着「中央標準時間」,如果你在美國,你可能知道這意味着什麼。但它也可能意味着「中國標準時間」或「古巴標準時間」。有一個相當不錯的時區縮寫列表here,清楚地顯示有重複。即使這個列表不是基於任何官方的。

而不是「PST」,您應該改爲使用時區標識符,例如IANA「America/Los_Angeles」或Rails「Pacific Time(美國&加拿大)」。

您可以使用Rails的ActiveSupport::TimeZone,它具有一些自定義的時區,或者如果您更喜歡更通用的標準,那麼您應該使用TZInfo Ruby Gem,它採用IANA區域標識符。