首页 > 解决方案 > 检查月份或日期或年份是否在字符串格式的两个日期范围内

问题描述

我最初在这里用不同的用例问了这个问题,但现在我意识到我可以有更多的案例来解决这个问题。

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

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

假设,我有两个日期字符串,可以是上述 3 种日期格式中的任何一种


用例 1

开始日期:2010-05-15和结束日期:2020-05

以下所有requested String 结果均在范围内

2010, 2020, 2010-05, 2020-05, 2020-05-22, 2010-05-15, 2010-05-22,2015-02-25

requested String以下所有内容均不在范围内

2009, 2021, 2010-04, 2020-06, 2010-05-14,2020-06-01


用例 2

开始日期:2010& 结束日期:2020-05-15

以下所有值均在范围内结果

2010, 2020, 2010-05, 2020-05, 2010-05-22, 2010-01-01, 2020-05-15,2015-02-25

以下所有值均不范围内

2009, 2021, 2020-06, 2020-05-16,2020-06-01


用例 3

开始日期:NULL& 结束日期:2020-05

之前所有请求的日期都是2020-05-31范围内的结果:

之后的所有值2020-05-31都不在范围内。


用例 4

开始日期:2010-05-15& 结束日期:NULL

之后2010-05-15的所有请求日期都是范围内的结果:

之前2010-05-15的所有值都不在范围内。


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

我不确定这是否是一个有效的解决方案,但这就是我的想法

只需将所有日期(请求、开始和结束)分解为数字,并将请求的年份与开始和结束的年份进行比较,如果请求日期中的月份可用并且在开始和结束时也可用,然后比较月份是否在范围内,日期也一样。

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

标签: javadatedatetimejava-time

解决方案


将所有字符串输入转换为LocalDate对象

停止思考字符串。这些字符串仅用于用户界面和将值序列化以进行存储。当您的应用程序运行时,您最终应该使用对象java.time对象来执行您的逻辑LocalDate

将所有输入转换为LocalDate.

检查输入的长度。

if( input.length() = 4 ) {…}

如果输入长度为 4 个字符,则解析为Year. 捕获异常,以防错误输入通过您的过滤器。从一年开始,LocalDate通过电话获得atDay

try{
    Year year = Year.parse( "2020" ) ; 
     LocalDate ld = year.atDay( 1 ) ;
} catch ( DateTimeParseException e ) {
    …
}

如果输入是七个字符,则解析为YearMonth. LocalDate通过atDay方法获取的表单。

try{
    YearMonth YearMonth = YearMonth.parse( "2020-05" ) ; 
     LocalDate ld = yearMonth.atDay( 1 ) ;
} catch ( DateTimeParseException e ) {
    …
}

如果输入是 10 个字符,则解析为LocalDate.

try{
    LocalDate localDate = LocalDate.parse( "2020-05-23" ) ; 
} catch ( DateTimeParseException e ) {
    …
}

将所有LocalDate对象放置到位后,进行比较。在定义时间跨度时始终使用半开放式方法。开始是包容的,而结束是排斥的。

提示:“not before”是询问“is equal to or later”的更短方式。

( ! target.isBefore( start ) ) && target.isBefore( stop ) 

推荐阅读