Java 检查LocalTime.now是否位于设置的持续时间内

Java 检查LocalTime.now是否位于设置的持续时间内,java,compare,intervals,localtime,Java,Compare,Intervals,Localtime,正如标题中所述,我想知道通过导入java.time.LocalTime所接收的当前时间是否在设置的持续时间之间 最后,如果时间在上午,我希望我的程序说“早上好”,如果在下午,我希望程序说“下午好”,等等 以下是我的持续时间: Duration Morning = Duration.between(LocalTime.of(05,31), LocalTime.of(11,30)); Duration Noon = Duration.between(LocalTime.of(11,31),

正如标题中所述,我想知道通过导入java.time.LocalTime所接收的当前时间是否在设置的持续时间之间

最后,如果时间在上午,我希望我的程序说“早上好”,如果在下午,我希望程序说“下午好”,等等

以下是我的持续时间:

Duration Morning = Duration.between(LocalTime.of(05,31),
LocalTime.of(11,30));
Duration Noon = Duration.between(LocalTime.of(11,31),    
LocalTime.of(13,30));
Duration Afternoon = Duration.between(LocalTime.of(13,31), 
LocalTime.of(17,30));
Duration Evening = Duration.between(LocalTime.of(17,31), 
LocalTime.of(22,30));
Duration Night = Duration.between(LocalTime.of(22,31),  
LocalTime.of(05,30));

我的问题是:如何检查当前时间是否在这些持续时间之间,以及如何将其转换为字符串,以便使用它发出不同的消息?

正如JB Nizet的评论正确指出的那样,持续时间不是一个间隔,也就是说,不是固定/固定在24小时时钟的时间线上。Java-8没有interval类。因此,您有以下选择:

编写定制的间隔类 然后(在这个极简且不完整的课程中):

最后一个else分支覆盖午夜前后的任何时间,因为到目前为止定义的所有其他间隔之间没有任何间隙(请参见下面我最后一个关于间隔边界的注释)

使用我的库Time4J a)第一种方式:class
net.time4j.range.ClockInterval

已经提供了这样的时钟间隔类。只需使用上一个示例,更改当前时间的导入语句和以下行:

PlainTime now = PlainTime.nowInSystemTime();
b)第二种方式:使用自定义的日周期设置格式

PlainTime now = PlainTime.nowInSystemTime();

Map<PlainTime, String> dayPeriods = new HashMap<>();
dayPeriods.put(PlainTime.of(5, 30), "morning");
dayPeriods.put(PlainTime.of(11, 30), "midday");
dayPeriods.put(PlainTime.of(13, 30), "afternoon");
dayPeriods.put(PlainTime.of(17, 30), "evening");
dayPeriods.put(PlainTime.of(22, 30), "night");

String p =
  ChronoFormatter.setUp(PlainTime.axis(), Locale.ENGLISH)
  .addLiteral("Good ")
  .addDayPeriod(dayPeriods)
  .addLiteral('.')
  .build()
  .format(now);
System.out.println(p); // Good midday.
对于英语,此方案用作标准:

日期间规则: T0600=上午 T1200=下午 T1800=晚上 T2100=夜间

如何处理区间边界? 一般来说,我建议使用半开放的方法来处理与(时钟)时间单位的任何持续时间相关的间隔边界。这意味着,间隔的开始总是包含的,并且完全等于上一个间隔的开放结束时间。这样做可以避免间隔之间的无意间隙,并且可以确保始终按当前时间匹配任何间隔


但您尝试以不同的方式对间隔边界进行建模。例如,您已将上午的时间间隔选择为“05:31/11:30”,而接下来的时间间隔从“11:31”开始。如果当前时间是偶然的“11:30:17”(请注意第二部分!),那么这样的时间与任何时间间隔都不匹配。

正如JB Nizet的评论所正确指出的,持续时间不是时间间隔,也就是说,不固定/固定在24小时时钟的时间线上。Java-8没有interval类。因此,您有以下选择:

编写定制的间隔类 然后(在这个极简且不完整的课程中):

最后一个else分支覆盖午夜前后的任何时间,因为到目前为止定义的所有其他间隔之间没有任何间隙(请参见下面我最后一个关于间隔边界的注释)

使用我的库Time4J a)第一种方式:class
net.time4j.range.ClockInterval

已经提供了这样的时钟间隔类。只需使用上一个示例,更改当前时间的导入语句和以下行:

PlainTime now = PlainTime.nowInSystemTime();
b)第二种方式:使用自定义的日周期设置格式

PlainTime now = PlainTime.nowInSystemTime();

Map<PlainTime, String> dayPeriods = new HashMap<>();
dayPeriods.put(PlainTime.of(5, 30), "morning");
dayPeriods.put(PlainTime.of(11, 30), "midday");
dayPeriods.put(PlainTime.of(13, 30), "afternoon");
dayPeriods.put(PlainTime.of(17, 30), "evening");
dayPeriods.put(PlainTime.of(22, 30), "night");

String p =
  ChronoFormatter.setUp(PlainTime.axis(), Locale.ENGLISH)
  .addLiteral("Good ")
  .addDayPeriod(dayPeriods)
  .addLiteral('.')
  .build()
  .format(now);
System.out.println(p); // Good midday.
对于英语,此方案用作标准:

日期间规则: T0600=上午 T1200=下午 T1800=晚上 T2100=夜间

如何处理区间边界? 一般来说,我建议使用半开放的方法来处理与(时钟)时间单位的任何持续时间相关的间隔边界。这意味着,间隔的开始总是包含的,并且完全等于上一个间隔的开放结束时间。这样做可以避免间隔之间的无意间隙,并且可以确保始终按当前时间匹配任何间隔


但您尝试以不同的方式对间隔边界进行建模。例如,您已将上午的时间间隔选择为“05:31/11:30”,而接下来的时间间隔从“11:31”开始。如果当前时间是“11:30:17”(请注意第二部分!),则该时间与任何时间间隔都不匹配。

您不能。持续时间不是时间范围。这只是一个时间量,比如35秒。你不能说8点35分是否在35秒之内。这毫无意义。这是javadoc:。创建自己的TimeRange类,包含两个LocalTime。添加一个contains(LocalTime)方法,检查给定的时间是否在范围中存储的两个时间之间。嘿,感谢您的快速回答,我如何确切地创建时间范围?我什么也找不到。再次感谢您的时间。正如我所说,它只是您创建的一个类,包含两个类型为LocalTime的字段(例如,名为start和end),以及一个包含(LocalTime)的方法。不应该超过20行左右的代码。谢谢,我会看看我是否能做到:)你不能。持续时间不是时间范围。这只是一个时间量,比如35秒。你不能说8点35分是否在35秒之内。这毫无意义。这是javadoc:。创建自己的TimeRange类,包含两个LocalTime。添加一个contains(LocalTime)方法,检查给定的时间是否在范围中存储的两个时间之间。嘿,感谢您的快速回答,我如何确切地创建时间范围?我什么也找不到。再次感谢您的时间。正如我所说,它只是您创建的一个类,包含两个类型为LocalTime的字段(例如,名为start和end),以及一个包含(LocalTime)的方法。不应该超过20行左右的代码。谢谢,我会看看我是否能做到:)
String p =
ChronoFormatter.ofTimePattern("'Good' B.", PatternType.CLDR, Locale.ENGLISH)
  .with(Attributes.OUTPUT_CONTEXT, OutputContext.STANDALONE)
  .format(now);
System.out.println(p); // Good afternoon.