【问题标题】:Check if month or day or year is in range of two dates检查月、日或年是否在两个日期的范围内
【发布时间】:2020-01-22 20:08:28
【问题描述】:

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

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

假设我在记录中有两个日期(即时) - 2010-05-01T00:00:00Z2020-03-01TT23:59:59.999999999Z

然后:

要求的日期 |范围结果

2018 |在范围内

2010 |在范围内

2009 |不在范围内

2018-03 |在范围内

2010-02 |不在范围内

2010-05 |在范围内(感谢@Ole V.V. 的更正)

2012-01-05 |在范围内

2020-03-01 |在范围内

2020-04-01 |不在范围内

我正在使用 Java 时间来检查日期是在给定日期之前还是之后,但在我的情况下,我有一个字符串可以是 3 种日期格式中的任何一种。

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

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

【问题讨论】:

  • 查看java.time package,特别是LocalDate、YearMonth 和Year 类。它们都有 isBefore 和 isAfter 方法。
  • 我认为您的示例不正确,请确认您的输入输出好吗?
  • 顺便说一句……您可能想了解定义时间跨度的半开放方法,其中开始是 inclusive 并且结束是 独家。这消除了您的最后一秒问题。
  • 2010 在您的范围内吗?有些年份是,有些不是。那么它的一部分就足够了吗?与 2020-03-01 相同。一天中的一纳秒不是。你说的是不是错误2010-03 |在范围内?该范围直到 2010 年 5 月的某个时间才开始。
  • @AMagic 我建议编辑您的问题并输入正确的信息:)

标签: java date datetime java-time


【解决方案1】:

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

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 demo

【讨论】:

  • 谢谢,YCH_L,我喜欢你的方法。我会使用你的逻辑,但可能需要稍作改动。
  • 如果开始日期和结束日期不是即时的,但它们也是YYYYYYYY-MMYYYY-MM-DD 三种格式中的任何一种的两个字符串,您会建议什么?
  • 是的,完全是@AMagic,无法在一个模式中验证所有三种格式,为此我分步进行,第一步将检查格式是否为@987654326 @,如果不行就移到第二种情况yyyy-MM,如果不行就移到第三种情况,也就是yyyy只是一年,如果没有人能正确则返回false
  • 但是当开始和结束日期也是 String 而不是 Instant 时,你会怎么做?开始日期是2010,结束日期是2013-04,请求日期是2011-06-20,所以是匹配的。我应该在我原来的问题中添加这个吗?
  • @AMagic 是的,当然,我的回答不涵盖这个具体案例,我建议创建一个新问题,澄清您想要涵盖的其他案例,并在您的新问题,我们会帮助你?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多