【问题标题】:How to slice a period of time in 24hrs? [closed]如何在 24 小时内切片一段时间? [关闭]
【发布时间】:2021-04-04 14:13:13
【问题描述】:

我正在使用 java.util.date 例如, 我有两个时间段:10:00:00 - 11:00:00,13:30:00-14:30:00

我想从 24 小时中删除这些时间段并获取剩余时间?

【问题讨论】:

  • 展示一个你想要实现的例子
  • @k-wasilewski 用于预约日程。假设 user1 在 10Am-11AM 和 14PM-15PM 有一个会议。我想获取 user1 的剩余时间段,可用于安排另一个会议。
  • 这只是一天中的时间,适用于任何一天,但不是特定日期?
  • @BasilBourque 给定日期。当我们输入日期时,我们需要获取该用户的可用时间段
  • 还有很多未知数,但可以这样:将 24 个时隙添加到 List,解析保留的时隙以获取列表元素的格式,从列表中删除那些已解析的时隙,然后解析将列表的元素转换为所需的格式。这都是关于从/到 java.util.date 来回解析,所以请阅读它..

标签: java spring spring-boot java-time


【解决方案1】:

避免使用旧的日期时间类

永远不要使用java.util.Date。该类是与 Java 的最早版本捆绑在一起的可怕的日期时间类之一。这些遗留类在几年前被 JSR 310 中定义的现代 java.time 类所取代。

LocalTime

如果您使用的是一般时间,而不是特定日期,请使用 LocalTime 类。

LocalTime.of( 10 , 0 )

创建一个类来定义时间范围。 ThreeTen-Extra 库为一对Instant 对象和一对LocalDateTime 对象提供了这样的范围类。但不幸的是,一对LocalTime 没有课程。

在 Java 16 及更高版本中,我们可以使用记录。或者定义一个常规类。

public record LocalTimeRange ( LocalTime start , LocalTime end ) ;

设置您的输入,从早到晚排序。

List< LocalTimeRange > inputs = List.of(
    new LocalTimeRange ( LocalTime.of( 10 , 0 ) , LocalTime.of( 11 , 0 ) ) ,
    new LocalTimeRange ( LocalTime.of( 13 , 30 ) , LocalTime.of( 14 , 30 ) ) 
);

创建时间范围对象。

对于一般的 24 小时工作日,我们可以从 LocalTime.MIN 开始。创建一个从最小值到第一个输入范围开始的范围。下一个范围是从第一个输入的结尾到后续输入的开头。起泡,冲洗,重复。在最后一个输入中,最后使用LocalTime.MINMAX,具体取决于您的需要。

请注意,我们正在使用半开放方法定义我们的时间跨度,其中开始是包含,而结束是独占。这允许跨度整齐地邻接而没有间隙。

要将这些应用于日期 (LocalDate),请指定时区 (ZoneId) 以生成 ZonedDateTime 对象。但请理解,并非所有时间值都存在于某些区域的某些日期。夏令时 (DST) 等异常意味着天的长度可能会有所不同,例如 23 小时或 23.5 小时或 25 小时。某些时间值可能会重复或可能不存在。

【讨论】:

  • 感谢@Basil Bourque 的回复。我会试试的
  • 非常好的建议!您可以包含有关 List#removeAll 的注释,OP 可以使用该注释从 LocalTimeRange 对象列表中删除 inputs,其中 inputs 包含要删除的 LocalTimeRange 列表。
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多