首页 > 解决方案 > 检查月、日或年是否在两个日期的范围内

问题描述

我有一个字符串过滤器,只能接受 3 种日期格式 - YYYY, YYYY-MM, YYYY-MM-DD.

我想检查请求的字符串是否在两个日期的范围内。

假设我在记录中有两个日期(即时)- 2010-05-01T00:00:00Z2020-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 种日期格式中的任何一种。

我能想到的一种解决方案是,如果请求是 YYYY,那么只检查它是否在两个日期的年份之间。如果请求是 YYYY-MM,则检查它是否在两个日期的年和月之间。等等。但我不知道如何使它工作。

有人可以帮忙解决这个问题吗?

标签: javadatedatetimejava-time

解决方案


您可以创建自己的方法来检查您的日期是否有效,在您的问题中,您有三种不同的情况,只有年份的日期,或只有年和月的日期,或完整的日期,在这种情况下,当你想解析唯一的年份时,你有一个小问题,我可以给你这个解决方案:

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 演示


推荐阅读