Java 计算特定白天在时间范围内的频率
自1970年以来,我有一个以毫秒为单位的开始日期和结束日期开始的时间范围:Java 计算特定白天在时间范围内的频率,java,date,time,calendar,timezone,Java,Date,Time,Calendar,Timezone,自1970年以来,我有一个以毫秒为单位的开始日期和结束日期开始的时间范围: long start; long end; 我想知道一个特定的白天是否和多长时间包含在这个范围内。假设白天是美国夏令时上午9:00,那么它多长时间出现一次 在Java中有一种简单而优雅的计算方法吗?如果您使用Java 8,您可以使用Java.time.OffsetDateTime,从起点开始,根据toOffsetTime调整时间,然后重复使用plusDays,直到超过结束时间 如果没有,那么您可以使用Joda的Date
long start;
long end;
我想知道一个特定的白天是否和多长时间包含在这个范围内。假设白天是美国夏令时上午9:00,那么它多长时间出现一次
在Java中有一种简单而优雅的计算方法吗?如果您使用Java 8,您可以使用
Java.time.OffsetDateTime
,从起点开始,根据toOffsetTime
调整时间,然后重复使用plusDays
,直到超过结束时间
如果没有,那么您可以使用Joda的DateTime
类实现类似的功能
如果没有能够正确处理日历的库,就不要尝试它。java.time
现代方法使用java.time类
从历元数转换你的计数。即时
是UTC时间线上的一个点,分辨率为纳秒
Instant startInstant = Instant.ofEpochMilli( startLong ) ;
Instant stopInstant = Instant.ofEpochMilli( stopLong ) ;
调整到你想要的时区
始终使用结构为大陆/地区
的真实时区名称
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdtStart = instantStart.atZone( z ) ;
ZonedDateTime zdtStop = instantStop.atZone( z ) ;
表示一天中的目标时间
LocalTime lt = LocalTime.of( 9 , 0 ) ;
获取一个带有起始日期和目标时间的ZoneDateTime
ZonedDateTime zdtStartAtTargetTime = ZonedDateTime.of( zdtStart.toLocalDate() , lt , z ) ;
将其与您的间隔开始时间进行比较,看看您是否应该计算此开始日期
在最后一天做同样的过程
计算从第二天开始到最后一天的第一个时刻之间的天数
long days = ChronoUnit.DAYS.between( start , stop ) ;
如果他们算数,加上你的第一天和最后一天
与FYI相比,Joda Time项目目前处于维护模式。团队建议迁移到java.time类。在ThreeTen Backport项目中,java.time的大部分功能都被向后移植到Java6和Java7。对于早期的Android,请参阅ThreeTenABP项目。