计算特定白天包含在时间范围内的频率



我有一个时间范围,从 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课实现类似的东西。

如果没有正确处理日历的库,请不要尝试。

相关内容

  • 没有找到相关文章

最新更新