检查LocalTime.now是否位于set Durations中

时间:2016-11-23 22:01:55

标签: java compare intervals localtime

如标题所述,我想知道我在import java.time.LocalTime收到的当前时间是否在设定的持续时间之间。

最后,我想让我的节目说'#34;早上好"如果时间是在早上,"下午好"如果在下午等等。

这是我的持续时间:

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));

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

1 个答案:

答案 0 :(得分:0)

正如JB Nizet的评论正确指出的那样,持续时间不是间隔,即 - 不固定/锚定在24小时制的时间线上。 Java-8没有间隔类。所以你有以下选择:

编写自定义间隔类

class ClockInterval {
    final LocalTime start;
    final LocalTime end;

    private ClockInterval(LocalTime start, LocalTime end) {
        this.start = start;
        this.end = end;
    }

    static ClockInterval between(LocalTime start, LocalTime end) {
        return new ClockInterval(start, end);
    }

    boolean contains(LocalTime time) {
        return !time.isBefore(start) && time.isBefore(end);
    }
}

然后(这个非常简约和不完整的课程):

ClockInterval morning = ClockInterval.between(LocalTime.of(5, 30), LocalTime.of(11, 30));
ClockInterval noon = ClockInterval.between(LocalTime.of(11, 30), LocalTime.of(13, 30));
ClockInterval afternoon = ClockInterval.between(LocalTime.of(13, 30), LocalTime.of(17, 30));
ClockInterval evening = ClockInterval.between(LocalTime.of(17, 30), LocalTime.of(22, 30));

LocalTime now = LocalTime.now();

if (morning.contains(now)) {
    System.out.println("Good morning.");
} else if (noon.contains(now)) {
    System.out.println("Good midday.");
} else if (afternoon.contains(now)) {
    System.out.println("Good afternoon.");
} else if (evening.contains(now)) {
    System.out.println("Good evening.");
} else {
    System.out.println("Good night.");
}

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

使用我的库Time4J

a)第一种方式:课程net.time4j.range.ClockInterval

Time4J已经提供了这样的时钟间隔类。只需使用前面的示例并更改当前时间的import语句和后续行:

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.

应该提到的是,通过模式符号B也可以对dayperiods进行自动本地化支持。但是,此处使用的dayperiod方案不是可自定义的,而是从Unicode数据派生的。

String p =
ChronoFormatter.ofTimePattern("'Good' B.", PatternType.CLDR, Locale.ENGLISH)
  .with(Attributes.OUTPUT_CONTEXT, OutputContext.STANDALONE)
  .format(now);
System.out.println(p); // Good afternoon.

对于英语,此方案用作标准:

  

天周期的规则:   T0600 =上午   T1200 =下午   小语种=晚上   T2100 =夜

如何处理区间边界?

一般情况下,我建议使用半开方法来区分边界与任何持续时间相关的(时钟 - )时间单位。这意味着,间隔的开始始终是包含的,并且恰好等于前一个间隔的开放结束的时间。这样做可以避免间隔之间无意间隙,并且您可以确保始终按当前时间匹配任何间隔。

但是你试图以不同的方式建模区间边界。例如,您选择了早晨间隔为“05:31/11:30”,以及从“11:31”开始的以下间隔。如果当前时间是“11:30:17”意外(注意第二部分!)那么这样的时间就不会与任何时间间隔相匹配。