LocalDateTime isAfter и isBefore время конфигурации - PullRequest
0 голосов
/ 04 июля 2018

Проблема в нахождении времени находится между startTime и endTime. У меня есть конфиг, как

timeframe1 = C1 | 04: 00 | 11.59 timeframe2 = C2 | 20.00 | 03: 59 timeframe3 = 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 Ответ

0 голосов
/ 04 июля 2018

Следующее должно сделать эту работу (грязно как есть - вам лучше перестроить ее в отдельный метод):

.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: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);
...