Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算特定白天在时间范围内的频率_Java_Date_Time_Calendar_Timezone - Fatal编程技术网

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

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

自1970年以来,我有一个以毫秒为单位的开始日期和结束日期开始的时间范围:

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项目。