为什么大多数java.util.Date方法被弃用了?

45

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

5个回答

44

那是因为两个相关的原因。它是关于日期和时间概念非常糟糕的实现,被Calendar类所取代。

Calendar类虽然有所改进,但仍有许多缺陷。因此,对于严肃的日期/时间工作,每个人都建议使用Joda-TimeJava 8引入了新的java.time.*包,受Joda-Time启发,由JSR-310定义,并旨在取代旧的Date/Calendar类。

编辑:针对特定问题——为什么Java Date类实现差?有许多原因。JavaDoc总结如下:

不幸的是,这些函数的API不适用于国际化。

除了这个通用的缺陷(涵盖诸如缺乏时区组件以及日期格式处理更好地在DateFormat中处理等问题,以及无法具有非公历日历表示之外),还有一些特定的问题非常困扰Date类,包括年份以从公元1900年偏移的方式表示的事实。

Calendar也有自己的问题,但早在JDK 1.1时期就明显java.util.Date不够用了。尽管Calendar是最糟糕的JDK API之一,但直到版本7才开始尝试解决它。


9
在JDK 1.1中,干净地实现从不足到难以理解的过渡 :) - clstrfsck
同时,“Date”类的命名不太合适。他们应该将其称为“Time”或“DateTime”。 - Alex R

17
  • Date可变
  • Date不支持时区

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


8
感谢IBM的日历、日期格式化程序以及其他相关东西。这是一个过度设计但并未真正解决实际问题的典型例子。 - mP.

11

它们被弃用是因为当时编写Date的重点是尽快发布JDK。

事实证明,处理日期和日历问题很困难。因此,他们设计了更加周全的Calendar类来处理与日历相关的难点。

他们弃用了Date方法并委派给Calendar,是因为他们不想改变现有Date方法的行为,并可能破坏现有应用程序。


2
这里有一篇来自Oracle的好文章:http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html 长期以来,Java开发人员一直抱怨普通开发人员在日期和时间用例方面的支持不足。例如,现有的类(如java.util.Date和SimpleDateFormatter)不是线程安全的,这可能会导致用户潜在的并发问题——这不是普通开发人员在编写日期处理代码时希望遇到的事情。
一些日期和时间类的API设计也相当糟糕。例如,java.util.Date中的年份从1900年开始,月份从1开始,天数从0开始,不是很直观。
java.util.Date代表时间轴上的一个瞬间——它是UNIX纪元以来毫秒数的封装器——但如果您调用toString(),结果会显示它有一个时区,这会让开发人员感到困惑。

似乎作者没有费心校对他的文章。根据Java的java.util.Date在线文档,日期从1开始,月份从0开始。两者与UNIX API对应,参见time.h - Olaf Dietsche

0

我不知道它被弃用的正式原因,但据我所知,GregorianCalendarJoda-Time支持对日期进行操作,这意味着您可以添加一天到一个日期中,并相应地更新其月份和年份。

例如,假设您想要计算当前日期后的一天,今天是5月31日;使用java.util.Date,您只需要getDays() +1,这将返回32,并且您必须自己处理当前月份没有32天的知识;使用GregorianCalendar或Joda.time,在5月31日加一天会得到一个表示6月1日的对象,从而隐藏了复杂性。


2
你的例子并不是 Date 对象的问题,而是使用它的代码的问题。GregorianCalendar 会做完全相同的事情。因此,整个观点都是无意义的。 - Supericy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接