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

Java LocalDateTime在配置时间之后和之前,java,java-8,java-time,Java,Java 8,Java Time,查找时间的问题介于开始时间和结束时间之间。我有类似的配置 时间框架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"

查找时间的问题介于开始时间和结束时间之间。我有类似的配置

时间框架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()
Map t1=newhashmap(){{
t1.认沽权(“客户”、“C1”);
t1.put(“开始时间”,“04:00”);
t1.put(“结束时间”,“11.59”);
}}
Map t2=新的HashMap(){{
t2.认沽权(“客户”、“C1”);
t2.投入(“开始时间”,“20.00”);
t2.put(“结束时间”,“03:59”);
}}
Map t3=新的HashMap(){{
t3.认沽权(“客户”、“C1”);
t3.put(“开始时间”、“12.00”);
t3.put(“结束时间”,“19.59”);
}}
名单{
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();
返回currentTime.isAfter(开始时间)和¤tTime.isBefore(结束时间);
}).findFirst();
返回timeFrame.get()
但是问题是->如果当前时间是21:00,那么它应该返回timeframe2地图详细信息

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


请帮助我们找到正确的结果。

以下内容应该可以完成这项工作(尽管脏兮兮-您最好将其重构为单独的方法):

编辑:此处添加了一项重要内容。你的时间范围有漏洞,因为它们包含了两边。示例:当
currentTime
为19:59:31时,会引发
NoTouchElementException
,因为没有时间帧包含此类时间。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);

21:00
20:00
之后,但不是在
03:59
之前,这使得您得到的结果有效。记住这是在同一天。如果结束时间在第二天,则该条目将返回true。。。请确保您发布的代码能够编译并运行,否则很难解决问题…不要使用“双括号初始化”-它不会做您认为它会做的事情。它为每个地图创建一个匿名类,这会导致各种奇怪和意外的问题。这一点尤其正确,因为您甚至没有利用它唯一的“好处”。@TomaszLinkowski请不要进行实质性更改代码或OP含义的编辑。修复OP中的代码不是编辑的目的。@Borishespider抱歉。我认为在编辑中编译代码是可以的,但显然。如果是在开始之前,你最好只在结束时间前加一天。@Boristeider我最初试过(参见编辑),但没有那么简单,因为:A)如果
currentTime
在20:00之后,您需要将日期添加到
endTime
中;或者B)如果
currentTime
在4:00之前,则从
startTime
中减去日期。总而言之,如果只使用完整日期而不是时间,它会变得不必要的复杂。我不确定您是否理解-当前时间是一个完全解析的UTC时间戳。开始时间将是今天的时间戳-这永远不需要更改。我们遇到问题的唯一情况是,如果结束时间在开始时间之前结束-这(根据OP)意味着结束时间实际上是明天,所以添加一天。我看不出晚上8点和凌晨4点在哪里…@Boristeider假设
currentTime
是凌晨3点:今天(顺便说一句,我从未建议更改
currentTime
)。当您处理晚上8点到凌晨4点的时间段,并将一天添加到
endTime
,您将以晚上8点:今天到凌晨4点:明天结束。你能看到凌晨3点:今天不包括在这样的时间跨度内吗?@Boristeider,但它应该包括在内!:)在其他什么时间段,你会有凌晨3点?
    return startTime.isBefore(endTime)
            ? !startTime.isBefore(currentTime) && currentTime.isBefore(endTime)
            : !startTime.isBefore(currentTime) || currentTime.isBefore(endTime);