当您查看java.util.Date类的javadoc时,大多数方法都已过时。为什么会这样做?
当您查看java.util.Date类的javadoc时,大多数方法都已过时。为什么会这样做?
那是因为两个相关的原因。它是关于日期和时间概念非常糟糕的实现,被Calendar
类所取代。
Calendar
类虽然有所改进,但仍有许多缺陷。因此,对于严肃的日期/时间工作,每个人都建议使用Joda-Time。Java 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才开始尝试解决它。
Date
可变Date
不支持时区后者导致它被Calendar
替代。前者与易用性相结合,导致两者都被Joda-Time/JSR-310 (java.time.*包)所替代。
它们被弃用是因为当时编写Date的重点是尽快发布JDK。
事实证明,处理日期和日历问题很困难。因此,他们设计了更加周全的Calendar类来处理与日历相关的难点。
他们弃用了Date方法并委派给Calendar,是因为他们不想改变现有Date方法的行为,并可能破坏现有应用程序。
我不知道它被弃用的正式原因,但据我所知,GregorianCalendar
和Joda-Time支持对日期进行操作,这意味着您可以添加一天到一个日期中,并相应地更新其月份和年份。
例如,假设您想要计算当前日期后的一天,今天是5月31日;使用java.util.Date
,您只需要getDays() +1
,这将返回32,并且您必须自己处理当前月份没有32天的知识;使用GregorianCalendar
或Joda.time,在5月31日加一天会得到一个表示6月1日的对象,从而隐藏了复杂性。