2014-12-05 67 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);