为了账号安全,请及时绑定邮箱和手机立即绑定

LocalDateTime isAfter和isBefore配置时间

LocalDateTime isAfter和isBefore配置时间

偶然的你 2021-04-28 21:14:12
查找时间的问题介于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))失败。请帮助如何找到正确的结果。
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


.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抛出a,因为没有时间范围包含该时间。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);


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 688 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信