41

用于读取的 javdocLocalDate#toDateMidnight如下:

从 v1.5 开始,建议您避免使用 DateMidnight 并使用 toDateTimeAtStartOfDay() 代替,因为下面详述了异常。

如果默认时区在午夜切换到夏令时并且此 LocalDate 表示该切换日期,则此方法将引发异常。问题是在所需日期没有午夜这样的时间,因此会引发异常。

某些时区不存在午夜这一事实似乎足以避免DateMidnight完全使用(假设您的代码没有使用已知没有这种 DST 情况的固定时区,并且永远不需要在未来)。

但是,DateMidnight不推荐使用,并且 javadoc 中没有针对DateMidnight类本身的类似建议或警告。此外,DateMidnight构造函数很乐意接受一个即时和时区,使得给定日期不存在午夜,而不是抛出一个IllegalArgumentExceptionlike LocalDate#toDateMidnight。结果的DateMidnight行为就像DateTime一天开始时的时间。

当给定日期不存在午夜时,为什么会LocalDate#toDateMidnight抛出异常而DateMidnight构造函数不存在?如果有的话,推荐的用例是DateMidnight什么?

4

6 回答 6

45

没有充分的理由使用DateMidnight. LocalDate是更好的选择。那是因为午夜在某些时区一年不会出现一次,完全破坏了课程的可用性,并在应用程序中产生错误。

构造函数被修复以避免最坏的问题,但是看到一个DateMidnight内部毫秒值指向 01:00 的对象并不是很好。

于 2013-07-18T14:16:04.053 回答
37

新的日期时间()。建议使用withTimeAtStartOfDay()

于 2014-03-23T02:38:11.253 回答
8

或者更好地直接使用该LocalDate方法toDateTimeAtStartOfDay绕过DateTime对象的创建(相对于上面的答案)。

new LocalDate().toDateTimeAtStartOfDay( myDateTimeZone )
于 2014-06-12T01:52:41.290 回答
4
于 2016-10-02T02:41:01.670 回答
0

看看我的代码中的异常

Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2015-03-27T00:00:00.000 (Asia/Amman)
    org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2015-03-27T00:00:00.000 (Asia/Amman)

现在我通过使用解决了它

LocalDate currentDate=new LocalDate();
someMethodSetsTheDate(currentDate.toDateTimeAtStartOfDay().toDate());

代替

someMethodSetsTheDate(new DateMidnight(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth()).toDate());

现在我的建议是使用 .toDateTimeAtStartOfDay() 来避免类似的异常。

请随时编辑我的答案谢谢

于 2015-03-24T10:54:44.257 回答
0

这里有一个更简单的解决方案,它将检查 dateTime 是否发生在当地时间午夜

private boolean isAtMidnight(org.joda.time.DateTime dateTime) {
   return dateTime.toLocalDateTime().getMillisOfDay() == 0;
}
于 2018-10-30T16:00:10.160 回答