LocalDateTime isAfter和isBefore配置时间

时间:2018-07-04 04:49:29

标签: java java-8 java-time

查找时间的问题介于startTime和endTime之间。我有类似的配置

timeframe1 = C1 | 04:00 | 11.59 timeframe2 = C2 | 20.00 | 03:59 timeframe3 = C3 | 12.00 | 19.59我需要获取currentime并检查它是否落在哪个timeFrame中,现在我正在做的事情< / p>

Map<String, String> t1 = new HashMap(){{
        t1.put("cust", "C1");
        t1.put("startTime", "04:00");
        t1.put("endTime", "11.59");
    }}
    Map<String, String> t2 = new HashMap(){{
        t2.put("cust", "C1");
        t2.put("startTime", "20.00");
        t2.put("endTime", "03:59");
    }}
    Map<String, String> t3 = new HashMap(){{
        t3.put("cust", "C1");
        t3.put("startTime", "12.00");
        t3.put("endTime", "19.59");
    }}
    List<Map<String, String> listValues = Arrays.asList(t1,t2,t3); 

    LocalDateTime currentTime = LocalDateTime.now(Clock.systemUTC());

    Optional<Map<String, Object>> timeFrame = listValues.stream()
        .filter(l -> {
            LocalDateTime startTime = LocalDateTime.of(ld, LocalTime.parse(String.valueOf(l.get("startTime")))).atZone(ZoneOffset.UTC).toLocalDateTime();
            LocalDateTime endTime = LocalDateTime.of(ld, LocalTime.parse(String.valueOf(l.get("endTime")))).atZone(ZoneOffset.UTC).toLocalDateTime();
            return currentTime.isAfter(startTime) && currentTime.isBefore(endTime);
        }).findFirst();

    return timeFrame.get()

但是问题是->如果当前时间是21:00,那么它应该返回timeframe2地图详细信息

但是条件currentTime.isAfter(startTime)&& currentTime.isBefore(endTime))失败,因为endTime是03:59。

请帮助您找到正确的结果。

1 个答案:

答案 0 :(得分:3)

以下应该可以完成工作(很脏-您最好将其重构为单独的方法):

.filter(l -> {
    LocalTime startTime = LocalTime.parse(l.get("startTime"));
    LocalTime endTime = LocalTime.parse(l.get("endTime"));

    LocalTime currentTime = LocalTime.now(Clock.systemUTC());
    return startTime.isBefore(endTime)
            ? currentTime.isAfter(startTime) && currentTime.isBefore(endTime)
            : currentTime.isAfter(startTime) || currentTime.isBefore(endTime);
})

编辑:此处的一项重要补充。您的时间范围内有漏洞,因为它们在两端都是包容性的。例如:当currentTime为19:59:31时,将抛出NoSuchElementException,因为没有时间范围包含该时间。 20:00:00也是一样。

因此,我建议将endTime设为专有,并将其指定为整小时(例如20:00)。然后,您还需要将currentTime.isAfter(startTime)更改为!startTime.isBefore(currentTime),如下所示:

    return startTime.isBefore(endTime)
            ? !startTime.isBefore(currentTime) && currentTime.isBefore(endTime)
            : !startTime.isBefore(currentTime) || currentTime.isBefore(endTime);