如果我要给出一个特定的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方法。
答案 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();