我有一个时间范围,从 1970 年以来以毫秒为单位表示的开始日期和结束日期:
long start;
long end;
我想知道特定白天是否以及多久包含一次。因此,假设白天是 09.00 am DST - 它包含在范围内的频率。
有没有一种简单而优雅的方法来计算Java?
java.time
现代方法使用 java.time 类。
转换您的纪元计数数字。Instant
是时间轴上分辨率为纳秒的点。
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
,直到你超过结束时间。
如果没有,那么你可以用乔达的DateTime
课实现类似的东西。
如果没有正确处理日历的库,请不要尝试。