如何解决使用startDate和endDate在Java中按日期过滤
我有数据库
eventName: "TestEvent",startDate : ISODate("2018-11-07T13:24:03.124Z"),endDate: ISODate("2020-11-07T13:24:03.124Z")
我要设置两个日期fromDate
和toDate
,
例如
fromDate:01/01/2020
toDate:01/01/2021
我想检查事件是否在我输入的范围内。 我这样尝试过,但结果不正确。
if ((fromDate.after(s.getStartDate()) && toDate.before(s.getEndDate()))
|| s.getStartDate().equals(fromDate) || s.getEndDate().equals(toDate))
请帮助我,我正在项目中使用utils.Date。
如果我使用:
fromDate:08/08/2017
toDate: 09/09/2022
或
fromDate:08/08/2019
toDate: 09/09/2019
它应该在此范围内返回此事件。
如果我使用:
fromDate:01/01/2000
toDate: 01/01/2001
此事件不应出现在结果中
解决方法
比较日期时要确保它们的格式相同。
我认为条件存在问题,应该看起来像这样:
Date startDate = s.getStartDate();
Date endDate = s.getEndDate();
if ((fromDate.before(startDate) || fromDate.equals(startDate)) &&
(toDate.after(endDate) || toDate.equals(endDate)){
// do you magic here
}
,
您正在尝试检查两个(时间)间隔是否重叠。一种简单的查看方法是,当(且仅当)第一个间隔的开始和结束中的一个或多个在第二个间隔之内时发生重叠,反之亦然。用以下方法进行测试:
boolean contains(Date d,Date startInclusive,Date endExclusive) {
return d.compareTo(startInclusive) >= 0 && d.before(endExclusive);
}
屈服
boolean intersects(Date from,Date to,Date start,Date end) {
return contains(from,start,end) || // s <= f < e (from inside start-end)
contains(to,end) || // s <= t < e (to inside start-end)
contains(start,from,to); // f <= s < t (from-to fully contains start-end)
}
请注意,这比编写(等效的)布尔表达式更具可读性。
我也完全同意@deHaar的评论:在java.time中使用类而不是java.util.Date 。从Java 8开始不推荐使用java.util.Date,这有很多问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。