为什么大多数java.util.Date方法不推荐使用?

当您查看java.util.Date类的javadoc时,大多数方法都被弃用。 为什么这样做?

那么,有两个相关的原因。 date和时间的概念实施得很差,被Calendar类取代。

Calendar课程虽然有所改进,但仍有很多不足之处,所以对于严重的date/时间工作,大家都会推荐Joda-Time 。 Java 8带来了由JSR-310定义的Joda-Time所启发的新的java.time。*包 ,并打算取代旧的Date / Calendar类。

编辑:针对执行不力的具体问题,有很多原因。 JavaDoc总结如下:

不幸的是,这些function的API不适合国际化。

除了这个普遍的缺陷之外(还包括缺less时区组件以及在DateFormat处理DateFormat好的date格式以及不能有非格里历日历表示的问题),还有一些特定的问题, Date类别,包括年份是在与普通时代年份相差1900的位置。

Calendar有自己的问题,但即使早在JDK 1.1中, java.util.Date也不会削减它。 尽pipeCalendar可以说是最糟糕的JDK API,但直到第7版才试图解决它。

  • Date是可变的
  • Date不支持时区

后者导致它被Calendar取代。 前者与易用性相结合,将被Joda-Time / JSR-310 ( java.time。*包 )所取代,

他们已经被弃用了,因为Date是在他们想把JDK赶出去的那一天,尽快写出来的。

原来date和日历很难。 所以,他们创build了日历类,更多的想法,以处理与日历工作的困难部分。

他们不推荐使用Date方法,而是委托给Calendar,因为他们不想更改现有Date方法的行为,并且可能会破坏现有的应用程序。

直接从Oracle获得一个很好的答案: http : //www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

Java开发人员长期以来的担忧是对普通开发人员的date和时间使用情况的支持不足。

例如,现有的类(如java.util.DateSimpleDateFormatter )不是线程安全的,从而导致潜在的并发性问题,而不是普通开发人员在编写date处理代码时所要处理的问题。

一些date和时间类也显示相当差的APIdevise。 例如, java.util.Date年份从1900开始,几个月从1开始,并且从0开始 – 不太直观。

java.util.Date表示时间轴上的一个瞬间 – 自UNIX时代起围绕毫秒数的一个包装 – 但是如果调用toString(),结果表明它有一个时区,导致混淆开发人员。

我不知道为什么它被弃用的官方原因,但据我可以告诉GregorianCalendar 日历和乔达时间的date支持操作,这意味着你可以添加,例如,一天的date,并有其月份和年相应更新。

例如,假设你想计算当前date之后的那一天,今天是5月31日; 使用java.util.Date ,你只需要getDays() +1 ,返回32,你必须处理当前月份没有32天的知识。 与GregorianCalendar或Joda.time,增加一天到5月31日的结果,代表6月1日的对象,隐藏复杂性从你的视线。