2014-12-05 29 views
1

有些商家通過「小時結束」跟蹤事件。一天中的每個小時由序數表示:序號時段「小時結束」轉換爲日期時間值

  • 1 ... 24爲UTC
  • 1 ... 23,1 ... 24,和1 ... 25用於與一個小時的日光節約時間的時區( DST)調整。

因此,每天的第一個小時,從午夜到01:00是Hour Ending 01

對我來說,這似乎是一個愚蠢的方式來跟蹤時間。半開放方法[)的開始時間是包含性的,結尾是排他性的,所以更合理的是使用時間。所以:

  • 2014-12-05T01:00:00.000將標誌着Hour Ending 01
  • 2014-12-06T00:00:00.000(午夜)將標誌着Hour Ending 24

事實上,這是我想在我的數據庫(Postgres),一個TIMESTAMP WITH TIME ZONE值從日期&序小時數轉換爲存儲的內容。所以我的問題是:

給定日期和序號「小時結束」號碼(1小時DST的地點爲1 ... 23/24/25),如何轉換爲日期時間值?

我熟悉Joda-Timejava.time。他們中的任何一個都提供了一種轉換方式?如果沒有,那麼什麼樣的算法可以處理序號轉換和DST?

或者我不應該打這個,只是將當地的日期存儲爲一個字符串與後綴的小時數?

+0

你實際上並不需要java.time或喬達這一點。難道你不能只使用一個普通的'日曆'對象,設置日,月和年,將其設置爲午夜,然後添加正確的小時數?這將在夏時制的開始和結束時起作用。 – 2014-12-05 23:58:55

+0

@DavidWallace作爲一項政策,我避免了java.util.Date/.Calendar的混亂。但是你的想法看起來很合理而且很簡單。 Joda-Time使用'withTimeAtStartOfDay'方法來獲取一天中的第一個時刻。 'plusHours'方法可以使用「小時結束」號碼來達到日期時間值。對於從日期+小時結束到日期 - 時間的轉換,這應該有效。換個方式,我不確定。 – 2014-12-06 01:30:34

+0

換個角度來說,你只需要在給定的時間和當天的午夜之間在幾小時內取得差異。 – 2014-12-06 01:32:26

回答

2

也許java.time方法,你要找的是truncatedTo,可用於採取任何ZonedDateTime和截斷分鐘和秒

ZonedDateTime zdt = ZonedDateTime.now(); 
ZonedDateTime rounded = zdt.truncatedTo(ChronoUnit.HOURS); 
ZonedDateTime hourEnd = rounded.plusHours(1);