代码之家  ›  专栏  ›  技术社区  ›  Rinsen S

LocalDateTime是在配置时间之后和之前

  •  1
  • Rinsen S  · 技术社区  · 6 年前

    寻找时间的问题介于开始时间和结束时间之间。我有像这样的配置

    时间框架1=c1 04:00 11.59时间框架2=c2 20.00 03:59时间框架3=c3 12.00 19.59我需要获取当前时间并检查它是否在哪个时间框架内,现在我正在这样做

    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,则应返回时间表2地图详细信息

    但是条件currenttime.isafter(starttime)&currenttime.isbefore(endtime))失败,因为endtime是03:59。

    请帮助找到正确的结果。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Tomasz Linkowski    6 年前

    下面的操作应该完成(尽管它很脏-您最好将它重构为一个单独的方法):

    .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也一样。

    因此,我建议 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);