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

为什么大多数java.util.Date方法都被弃用?,java,datetime,date,deprecated,Java,Datetime,Date,Deprecated,当您查看java.util.Date类的javadoc时,大多数方法都不推荐使用。为什么要这样做 有两个相关的原因。这是一个非常糟糕的日期和时间概念的实现,它被日历类所取代 《日历》课程虽然有所改进,但仍有许多地方有待改进,因此,对于严肃的日期/时间工作,每个人都推荐。带来新的日期/日历类,灵感来源于Joda Time,由旧日期/日历类定义,旨在取代旧日期/日历类 编辑:关于为什么执行不力的具体问题,有很多原因。JavaDoc将其总结如下: 不幸的是,这些函数的API不适合国际化 除了这一普遍的

当您查看java.util.Date类的javadoc时,大多数方法都不推荐使用。为什么要这样做

有两个相关的原因。这是一个非常糟糕的日期和时间概念的实现,它被
日历
类所取代

《日历》课程虽然有所改进,但仍有许多地方有待改进,因此,对于严肃的日期/时间工作,每个人都推荐。带来新的日期/日历类,灵感来源于Joda Time,由旧日期/日历类定义,旨在取代旧日期/日历类

编辑:关于为什么执行不力的具体问题,有很多原因。JavaDoc将其总结如下:

不幸的是,这些函数的API不适合国际化

除了这一普遍的缺陷(包括缺少时区组件、日期格式在
DateFormat
中处理得更好以及无法使用非公历表示法等问题),还有一些具体的问题真正影响了
date
类,包括该年与普通纪年的偏移量为1900


Calendar
也有自己的问题,但即使早在JDK1.1中,
java.util.Date
显然也无法解决它。尽管日历可以说是最差的JDK API,但直到第7版才开始尝试解决它。

他们不赞成日历,因为日期写得尽可能快,早在他们想把JDK赶出去的那一天

事实证明,日期和日历都是硬的。因此,他们创建了Calendar类,这需要更多的思考,以便处理使用日历的困难部分

他们不赞成使用Date方法并将其委托给Calendar,因为他们不想更改现有Date方法的行为,也不想破坏现有的应用程序。

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

后者导致它被
日历
取代。前者,再加上易于使用,导致两者都被/()

取代。我不知道它被弃用的官方原因,但据我所知,
GregoriaCalendar
支持日期操作,这意味着您可以在日期中添加一天,并相应地更新其月份和年份


例如,假设您要计算当前日期后的第二天,而今天是5月31日;使用
java.util.Date
,您只需要
getDays()+1
,返回32天,您必须自己处理当前月份没有32天的知识;使用
GregoriaCalendar
或Joda.time,将一天添加到5月31日会生成一个表示6月1日的对象,将复杂性隐藏在你的视线之外。

以下是直接从Oracle获得的一个好答案:

Java开发人员长期存在的一个问题是对普通开发人员的日期和时间用例的支持不足

例如,现有的类(如
java.util.Date
SimpleDataFormatter
)不是线程安全的,这会导致用户潜在的并发问题,而不是一般开发人员在编写日期处理代码时希望处理的问题

一些日期和时间类也表现出相当糟糕的API设计。例如,
java.util.Date
中的年从1900开始,月从1开始,天从0开始——这不是很直观

java.util.Date
表示时间轴上的一个瞬间,它是自UNIX纪元以来毫秒数的包装器,但如果调用toString(),结果表明它有一个时区,会引起开发人员的混淆


在JDK1.1:)中清晰地实现了从不足到不可理解的过渡:)此外,“Date”类的命名也很糟糕。他们应该称之为时间,或者DateTime。感谢IBM提供日历、DateFormatter和所有其他相关的垃圾。另一个出色的例子是过度工程而没有实际解决手头的问题。你的例子不是Date对象的问题,而是使用它的代码的问题。GregorianCalendar也会做同样的事情。所以这一点毫无意义。看来作者没有费心校对他的文章。在Java的在线文档中,天从
1
开始,月从
0
开始。两者都对应于UNIX API,请参阅。