LocalDateTime isAfter 和 isBefore 配置时间
LocalDateTime isAfter and isBefore config time
查找介于 startTime 和 endTime 之间的时间时出现问题。我有这样的配置
timeframe1 = C1|04:00|11.59 timeframe2 = C2|20.00|03:59 timeframe3 = C3|12.00|19.59 我需要获取当前时间并检查它是否属于哪个 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 那么它应该 return timeframe2 map details
但是条件 currentTime.isAfter(startTime) && currentTime.isBefore(endTime) ) 失败,因为 endTime 是 03:59 .
请帮助找到正确的结果。
下面应该可以完成这项工作(虽然很脏 - 你最好将它重构为一个单独的方法):
.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);
查找介于 startTime 和 endTime 之间的时间时出现问题。我有这样的配置
timeframe1 = C1|04:00|11.59 timeframe2 = C2|20.00|03:59 timeframe3 = C3|12.00|19.59 我需要获取当前时间并检查它是否属于哪个 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 那么它应该 return timeframe2 map details
但是条件 currentTime.isAfter(startTime) && currentTime.isBefore(endTime) ) 失败,因为 endTime 是 03:59 .
请帮助找到正确的结果。
下面应该可以完成这项工作(虽然很脏 - 你最好将它重构为一个单独的方法):
.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);