java - 检查月份或日期或年份是否在字符串格式的两个日期范围内
问题描述
我最初在这里用不同的用例问了这个问题,但现在我意识到我可以有更多的案例来解决这个问题。
我有一个字符串过滤器,只能接受 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 种日期格式中的任何一种。
我不确定这是否是一个有效的解决方案,但这就是我的想法
只需将所有日期(请求、开始和结束)分解为数字,并将请求的年份与开始和结束的年份进行比较,如果请求日期中的月份可用并且在开始和结束时也可用,然后比较月份是否在范围内,日期也一样。
有人可以帮忙解决这个问题吗?
解决方案
将所有字符串输入转换为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 )
推荐阅读
- github - 通过 GitHub API 获取 release 的验证对象
- django - nginx“proxy_pass”指令中的参数数量无效
- git - git blame --color-by-age 在 git config 中设置为默认值
- sql - T-SQL 事务遇到错误但未取消
- python - 在嵌套列表中反转字符串而不切片或反转
- php - PHP preg_split() 模式
- arduino - 单击链接后html按钮不会更改,我应该手动刷新页面
- java - 继承与策略模式
- javascript - 量角器非角度测试不服从等待和睡眠,直到代码出现错误
- docker - EC2 实例和 Docker 容器之间没有连接