猿问

LocalDateTime isAfter和isBefore配置时间

查找时间的问题介于startTime和endTime之间。我有像这样的配置


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


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地图详细信息


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


请帮助如何找到正确的结果。


偶然的你
浏览 689回答 1
1回答

慕的地8271018

以下应该完成这项工作(实际上很脏-您最好将其重构为单独的方法):.filter(l -> {&nbsp; &nbsp; LocalTime startTime = LocalTime.parse(l.get("startTime"));&nbsp; &nbsp; LocalTime endTime = LocalTime.parse(l.get("endTime"));&nbsp; &nbsp; LocalTime currentTime = LocalTime.now(Clock.systemUTC());&nbsp; &nbsp; return startTime.isBefore(endTime)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? currentTime.isAfter(startTime) && currentTime.isBefore(endTime)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : currentTime.isAfter(startTime) || currentTime.isBefore(endTime);})编辑:这里一个重要的补充。您的时间范围内有漏洞,因为双方都是包容各方的。示例:当currentTime为19:59:31时,将NoSuchElementException抛出a,因为没有时间范围包含该时间。20:00:00也是一样。因此,我建议进行endTime排它并将其指定为全时(例如20:00)。然后,您还需要将更currentTime.isAfter(startTime)改为!startTime.isBefore(currentTime),如下所示:&nbsp; &nbsp; return startTime.isBefore(endTime)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? !startTime.isBefore(currentTime) && currentTime.isBefore(endTime)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : !startTime.isBefore(currentTime) || currentTime.isBefore(endTime);
随时随地看视频慕课网APP

相关分类

Java
我要回答