Проверьте, находится ли месяц, день или год в диапазоне двух дат - PullRequest
1 голос
/ 22 января 2020

У меня есть фильтр, который является строкой и может принимать только 3 формата даты - YYYY, YYYY-MM, YYYY-MM-DD.

Я хочу проверить, находится ли запрашиваемая строка в диапазоне двух дат.

Допустим, у меня есть две даты (Instants) в записи - 2010-05-01T00:00:00Z & 2020-03-01TT23:59:59.999999999Z

Тогда:

Запрошенная дата | Диапазон результатов

2018 | в диапазоне

2010 | в диапазоне

2009 | НЕ в диапазоне

2018-03 | в диапазоне

2010-02 | НЕ в диапазоне

2010-05 | в диапазоне (спасибо за исправление @Ole VV)

2012-01-05 | в диапазоне

2020-03-01 | в диапазоне

2020-04-01 | НЕ в диапазоне

Я использую Java время, чтобы проверить, является ли дата до или после указанных дат, но в моем случае у меня есть строка, которая может быть в любой из 3-х дат -formates.

Одно из решений, которое я могу придумать, - это если запрос ГГГГ, тогда проверяйте, если это между годами двух дат. Если запрос ГГГГ-ММ, проверьте, соответствует ли он году и месяцу двух дат. И так далее. Но я не уверен, как заставить это работать.

Может кто-нибудь помочь решить эту проблему?

1 Ответ

3 голосов
/ 23 января 2020

Вы можете создать свой собственный метод, чтобы проверить, действительна ли ваша дата. В вашей задаче у вас есть три различных случая: дата, в которой есть только год, или дата, в которой есть только год и месяц, или полная дата, в В этом случае у вас есть небольшая проблема, когда вы хотите разобрать только год, я могу дать вам следующее решение:

public static boolean isValid(String date, Instant start, Instant end) {
    LocalDate sld = start.atOffset(ZoneOffset.UTC).toLocalDate();
    LocalDate eld = end.atOffset(ZoneOffset.UTC).toLocalDate();
    try {
        LocalDate ld = LocalDate.parse(date);
        return ld.isAfter(sld) && ld.isBefore(eld);
    } catch (DateTimeParseException e) {}

    try {
        YearMonth ym = YearMonth.parse(date);
        return ym.isAfter(YearMonth.from(sld)) && ym.isBefore(YearMonth.from(eld));
    } catch (DateTimeParseException e) {}

    try {
        Year y = Year.parse(date);
        return y.isAfter(Year.from(sld)) && y.isBefore(Year.from(eld));
    } catch (DateTimeParseException e) {}
    return false;
}

Вот пример Idemo

...