java.util.Date/JodaTime:给定java.util.Date,生成该给定日期的开始和结束

时间:2011-07-07 14:06:37

标签: java date jpa jodatime

如果我要给出一个特定的java.util.Date,我该如何生成该给定日期的开始和结束。例如,我的日期为August 25, 2011,那么我的开始日期为August 25, 2011 00 00 00,日期结束时为August 25, 2011 23 59 59

背景 :(如果您想知道我问这个问题的原因,请阅读以下内容)

我使用JPA将date映射到我的MySql数据库,就像这样。我希望date也有时间,所以我使用TemoporalType.TIMESTAMP

@Temporal(TemporalType.TIMESTAMP)
private Date dateProcess; //java.util.Date

我需要查询给定特定日期的所有数据,并且由于date存储如上,我需要一个日期范围来实现我想要的。

我的游戏计划是将java.util.Date转换为JodaTime#DateTinme,然后在那里构建开始和结束日期,并将其转换回,以便我可以将参数作为参数传递给JPQL 。但似乎JodaTime非常不可变,我似乎无法在任何地方看到一个setter方法。

3 个答案:

答案 0 :(得分:7)

java.util.Date及时表示即时,不提及时区或日历。根据观察者的时区,同一时刻的开始/结束时间会有很大差异。

您可以执行以下操作:

DateTime dateTime = new DateTime(date.getTime(), timeZone);
LocalDate localDate = dateTime.ToLocalDate();

DateTime startOfDay = localDate.toDateTimeAtStartOfDay(timeZone);
DateTime startOfNextDay = localDate.plusDays(1).toDateTimeAtStartOfDay(timeZone);

从最后两个变量中,您可以根据需要返回java.util.Date值。通常他们都是午夜,但他们可能不是。

请注意,您应该以独占方式使用第二天的开头,而不是以包容的方式使用当天的最后一秒,以避免错过值,例如2011年8月25日23:59:59.500 ...

答案 1 :(得分:1)

我相信你想要的类型是DateMidnight。制作一个新的DateMidnight并将其传递给相关的DateTime,并将该日期视为同一天早晨的午夜。然后,您还可以使用plusDays()功能添加1天来获取结束时间。

答案 2 :(得分:1)

Date date; // your date

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date startDate = calendar.getTime();

calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Date endDate = calendar.getTime();