【问题标题】:Calculate how often specific daytime is contained in time range计算特定白天包含在时间范围内的频率
【发布时间】:2018-04-29 09:31:26
【问题描述】:

我有一个从 1970 年以来以毫秒表示的开始日期和结束日期的时间范围:

long start;
long end;

我想知道某个特定的白天是否包含在这个范围内,以及多久包含一次。因此,假设白天是 DST 上午 9 点 - 它包含在范围内的频率。

在 Java 中是否有一种简单而优雅的计算方法?

【问题讨论】:

    标签: java date time calendar timezone


    【解决方案1】:

    java.time

    现代方法使用 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 ) ;
    

    如果计算在内,请将您的第一天和最后一天相加。

    对比一下

    【讨论】:

      【解决方案2】:

      如果您使用的是 Java 8,则可以使用 java.time.OffsetDateTime,从起点开始,根据 toOffsetTime 调整时间,然后重复使用 plusDays,直到超过结束时间。

      如果没有,那么您可以使用 Joda 的 DateTime 类实现类似的效果。

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

      【讨论】:

      • 仅供参考,Joda-Time 项目现在处于维护模式。团队建议迁移到 java.time 类。 ThreeTen-Backport 项目中的大部分 java.time 功能都向后移植到 Java 6 和 Java 7。对于早期的 Android,请参阅 ThreeTenABP 项目。
      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多