【发布时间】:2018-04-29 09:31:26
【问题描述】:
我有一个从 1970 年以来以毫秒表示的开始日期和结束日期的时间范围:
long start;
long end;
我想知道某个特定的白天是否包含在这个范围内,以及多久包含一次。因此,假设白天是 DST 上午 9 点 - 它包含在范围内的频率。
在 Java 中是否有一种简单而优雅的计算方法?
【问题讨论】:
标签: java date time calendar timezone
我有一个从 1970 年以来以毫秒表示的开始日期和结束日期的时间范围:
long start;
long end;
我想知道某个特定的白天是否包含在这个范围内,以及多久包含一次。因此,假设白天是 DST 上午 9 点 - 它包含在范围内的频率。
在 Java 中是否有一种简单而优雅的计算方法?
【问题讨论】:
标签: java date time calendar timezone
现代方法使用 java.time 类。
转换您的时代数字。 Instant 是 UTC 时间线上的一个点,分辨率为纳秒。
Instant startInstant = Instant.ofEpochMilli( startLong ) ;
Instant stopInstant = Instant.ofEpochMilli( stopLong ) ;
调整到您想要的时区。
始终使用结构为continent/region 的真实时区名称。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdtStart = instantStart.atZone( z ) ;
ZonedDateTime zdtStop = instantStop.atZone( z ) ;
表示您的目标时间。
LocalTime lt = LocalTime.of( 9 , 0 ) ;
获取ZonedDateTime,其中包含您的开始日期和目标时间。
ZonedDateTime zdtStartAtTargetTime = ZonedDateTime.of( zdtStart.toLocalDate() , lt , z ) ;
将其与您的间隔开始时间进行比较,看看您是否应该计算此开始日期。
最后一天做同样的过程。
计算从第二天开始到最后一天第一刻之间的天数。
long days = ChronoUnit.DAYS.between( start , stop ) ;
如果计算在内,请将您的第一天和最后一天相加。
对比一下
【讨论】:
如果您使用的是 Java 8,则可以使用 java.time.OffsetDateTime,从起点开始,根据 toOffsetTime 调整时间,然后重复使用 plusDays,直到超过结束时间。
如果没有,那么您可以使用 Joda 的 DateTime 类实现类似的效果。
如果没有能够正确处理日历的库,请不要尝试。
【讨论】: