问题描述
要求: 致力于网络研讨会会议,用户可以通过填写表格来安排会议。该表单包含主题、描述、成员列表、会议开始时间和日期。这些详细信息存储在表中。安排会议后,用户可以查看他的即将召开的和以前的会议。
日期使用 DATE 数据类型以这种格式存储 2021-02-22。 开始时间:12:48:00,采用这种格式。
需要确定会议日期是尚未开始还是之前的会议?
public WebinarEntity getScheduledMeeting(int CompanyID){
Date currentDate=new Date(); //Todays Date.
//get the stored data.
DAO_Factory dao=new DAOImpl();
Date storedDate=dao.getMeetingDate(CompanyID);
if(currentDate.before(storedDate)
{
//display the meeting details as prevIoUs
}
else {
//display the meeting details as upcoming!
}
return new WebinarEntity(Details of prevIoUs or upcoming);
如何编码以根据日期和时间查找存储的数据是即将到来的还是以前的?
上面代码中的问题:例如,我们的会议安排在 22-2-2021 下午 4:00,此会议详细信息是显示在上次会议列中,而应该显示/显示在即将召开的中。
编辑:CurrentDate-2021-02-22 08:00am
存储日期-2021-02-22 04:00pm
解决方法
永远不要使用任何一个糟糕的 Date
类。它们在多年前被 JSR 310 中定义的现代 java.time 类所取代。
您标记了 Joda-Time 项目。但是你看不到正在使用它。该项目现在处于维护模式,也被 java.time 取代。
您的问题忽略了时区的关键问题。
使用 LocalDateTime
和 ZoneId
进行预约,将其中的每一个都存储在数据库的一对列中。 SQL 标准类型将分别为 TIMESTAMP WITHOUT TIME ZONE
和 VARCHAR
。您可能还想使用标准 ISO 8601 格式将会议持续时间存储为文本。
在运行时,当您需要制定时间表时,将两者结合起来得到一个 ZonedDateTime
。此类代表一个时刻,您可以与当前时刻进行比较以确定它是过去还是未来。要结束会议,请为您的 ISO 8601 字符串创建一个 Duration
对象,并将其添加到您的 ZonedDateTime
开头。
这个问题已经在 Stack Overflow 上多次解决了。我自己和其他人已经详细地写过这个话题。所以搜索以了解更多信息。
CurrentDate-2021-02-22 08:00am 存储日期-2021-02-22 04:00pm
LocalDateTime ldt = LocalDateTime.of( 2021,2,22,8,0 ) ; // Stored as TIMESTAMP WITHOUT TIME ZONE in database.
ZoneId z = ZoneId.of( "America/Edmonton" ) ; // Stored as text in database,in `Continent/Region` format.
ZonedDateTime start = ldt.atZone( z ) ; // Dynamically calculated,not stored.
Duration duration = Duration.parse( "PT1H30M" ) ; // Stored in database as text,in standard ISO 8601 format `PnYnMnDTnHnMnS`.
ZonedDateTime end = start.plus( duration ) ; // Dynamically calculated,not stored.
ZonedDateTime now = ZonedDateTime.now( z ) ;
boolean isFuture = start.isAfter( now ) ;
Duration untilThen = Duration.between( now,start ) ;