【发布时间】:2018-11-20 02:18:36
【问题描述】:
我必须检查预订的开始日期和结束日期是否在用户选择的时间跨度之间。因此,如果用户说他想查看从 2 月 12 日到 2 月 15 日的所有预订,它应该只显示该时间段内的预订。我只是想不通,我希望有人能帮助。这是我迄今为止的尝试:
Timestamp tsBeginning = new Timestamp(dateBeginning.getTime()); //date entered by user
Timestamp tsEnd = new Timestamp(dateEnd.getTime()); //date entered by user
for (Booking b : bookingList) {
if(((b.getBeginning().after(tsBeginning) || b.getBeginning().equals(tsBeginning)) && b.getBeginning().before(tsEnd) || b.getBeginning().equals(tsEnd))
&& ((b.getEnd().after(tsEnd) || b.getEnd().equals(tsEnd)) && (b.getEnd().before(tsEnd) || b.getEnd().equals(tsEnd)))){
bookingsForRoomInPeriod.add(b);
【问题讨论】:
-
如果预订与边界重叠,您可能希望将其包括在内,对吗?用户选择 2 月 12 日 15:00 到 2 月 15 日 21:00 有一个预订 2 月 12 日 14 到 16 日——是否应该包括在内?
-
如果您使用的是 sql,您应该只使用数据库查询来过滤这些日期范围
-
一旦你开始混合
&&和||而不用括号将它们分组,我认为出错的可能性很高。您可能想用一些括号来说明您希望它们执行的顺序。 -
另外,我会打破那个巨大的
if声明,让一些更容易阅读的帮助方法为你做一些检查(比如一个日期是否与另外两个日期一起),这样整个事情变得更容易阅读。我认为操作顺序(括号)和一长串逻辑运算符会让您感到困惑。 -
我一般觉得写
if(...) { /* before */ } else if (...) { /* after */ } else { /* in range */ }这种东西最好看。尝试这种方式,您可能会发现逻辑更易于阅读。如果添加新的成员函数,那么你可以写if(!booking.endsBefore(...) && !booking.startsAfter(...)){...。