Java 检查开始日期和结束日期是否在间隔内
Java Check wether Beginning and End Dates are within interval
我必须检查预订的开始日期和结束日期是否在用户选择的时间跨度之间。因此,如果用户说他想查看从 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);
编辑: 讨论了很久。我终于明白了:预订开始和结束的日期和一天中的一个小时(比如 6 月 14 日 3:30 下午)。用户输入开始日期和结束日期,但没有时间。您需要包括完全包含在 包含 日期范围内的预订。也就是说,在开始日期 00:00 和结束日期 24:00 之间。
LocalDate userBeginning = // …
LocalDate userEnd = // …
LocalDateTime userBeginningTime = userBeginning.atStartOfDay();
LocalDateTime userEndTime = userEnd.plusDays(1).atStartOfDay();
if (! b.getBeginning().isBefore(userBeginningTime)
&& ! b.getEnd().isAfter(userEndTime)) {
bookingsForRoomInPeriod.add(b);
}
我假设 getBeginning
和 getEnd
return LocalDateTime
。在 Java 中,“一天的结束”(午夜)表示为第二天的 00:00,这就是为什么我将用户输入的结束日期增加 1 天的原因。
你好像用的Timestamp
class 早就过时了。 java.time
是现代的 Java 日期和时间 API,比老式的日期和时间 class 更好用。 java.sql
中的日期和时间 class 尤其有一个丑陋的设计,半途试图隐藏它们是(同样设计不佳)java.util.Date
的子class。
假设您选择 Timestamp
是因为您从数据库中获取时间,并假设您可以使用至少 Java 8 和至少 JDBC 4.2,得到 LocalDateTime
使用 ResultSet.getObject
方法之一直接从您的结果集中获取对象,将 LocalDateTime.class
作为您想要的类型传递。
上一版答案:
…only the date matters not the time, and only bookings that are
completely within the selected timestamps of the user should be
included
if (! b.getBeginning().before(tsBeginning) && ! b.getEnd().after(tsEnd)) {
bookingsForRoomInPeriod.add(b);
}
我使用“not before”作为要求“on or after”的简短方式。同样,我使用“not after”来表示“before or on”。
就是说,您似乎使用的 Timestamp
class 早已过时,也不适合没有时间的日期。使用没有一天中时间的数据库数据类型(在大多数 RDBMS 中,它被简单地称为 date
),并使用 Java 中的 java.time
中的 LocalDate
。 java.time
是现代的 Java 日期和时间 API,比老式的日期和时间 class 更好用。 java.sql
中的日期和时间 class 尤其有一个丑陋的设计,半途试图隐藏它们是(同样设计不佳)java.util.Date
的子class。
我必须检查预订的开始日期和结束日期是否在用户选择的时间跨度之间。因此,如果用户说他想查看从 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);
编辑: 讨论了很久。我终于明白了:预订开始和结束的日期和一天中的一个小时(比如 6 月 14 日 3:30 下午)。用户输入开始日期和结束日期,但没有时间。您需要包括完全包含在 包含 日期范围内的预订。也就是说,在开始日期 00:00 和结束日期 24:00 之间。
LocalDate userBeginning = // …
LocalDate userEnd = // …
LocalDateTime userBeginningTime = userBeginning.atStartOfDay();
LocalDateTime userEndTime = userEnd.plusDays(1).atStartOfDay();
if (! b.getBeginning().isBefore(userBeginningTime)
&& ! b.getEnd().isAfter(userEndTime)) {
bookingsForRoomInPeriod.add(b);
}
我假设 getBeginning
和 getEnd
return LocalDateTime
。在 Java 中,“一天的结束”(午夜)表示为第二天的 00:00,这就是为什么我将用户输入的结束日期增加 1 天的原因。
你好像用的Timestamp
class 早就过时了。 java.time
是现代的 Java 日期和时间 API,比老式的日期和时间 class 更好用。 java.sql
中的日期和时间 class 尤其有一个丑陋的设计,半途试图隐藏它们是(同样设计不佳)java.util.Date
的子class。
假设您选择 Timestamp
是因为您从数据库中获取时间,并假设您可以使用至少 Java 8 和至少 JDBC 4.2,得到 LocalDateTime
使用 ResultSet.getObject
方法之一直接从您的结果集中获取对象,将 LocalDateTime.class
作为您想要的类型传递。
上一版答案:
…only the date matters not the time, and only bookings that are completely within the selected timestamps of the user should be included
if (! b.getBeginning().before(tsBeginning) && ! b.getEnd().after(tsEnd)) {
bookingsForRoomInPeriod.add(b);
}
我使用“not before”作为要求“on or after”的简短方式。同样,我使用“not after”来表示“before or on”。
就是说,您似乎使用的 Timestamp
class 早已过时,也不适合没有时间的日期。使用没有一天中时间的数据库数据类型(在大多数 RDBMS 中,它被简单地称为 date
),并使用 Java 中的 java.time
中的 LocalDate
。 java.time
是现代的 Java 日期和时间 API,比老式的日期和时间 class 更好用。 java.sql
中的日期和时间 class 尤其有一个丑陋的设计,半途试图隐藏它们是(同样设计不佳)java.util.Date
的子class。