为什么“new Date(int year, int month, int day)”被弃用了?

2022-08-31 16:44:36

我最近继承的应用程序充满了关于构造函数的弃用警告:

Date d = new Date(int year, int month, int day)

有没有人知道或可以指出一个原因,为什么像这样简单的东西被这样的东西“取代”了:

Date d = null;
Calendar cal = GregorianCalendar.getInstance();
cal.set(1900 + year, month, day);
d = cal.getTime();

现在,显然弃用警告本身并不是问题,但是您能想象如果删除此构造函数,数百万的LOC会痛苦地哭泣吗?

在我简短的基准测试小玩意中,后者需要大约50%的时间来执行。


答案 1

最初,它旨在包含有关日期的所有逻辑,但API设计人员最终意识到,到目前为止,他们拥有的API非常不足,无法完全扩展以正确处理诸如时区,区域设置,不同日历,夏令时等问题。Date

因此,他们创建了处理所有这些复杂性,并降级为一个简单的时间戳,弃用了其处理格式,解析和单个日期字段的所有功能。CalendarDate

顺便说一句,在内部,这些方法(如构造函数)现在调用 ,因此,如果您看到速度的差异,那么在调用 时您做错了什么。Date(int, int, int)CalendarCalendar

底线:Java的API过于复杂,它不是人类的日期概念,唯一的问题是它没有提供太多最常见用法的快捷方式。CalendarCalendar


答案 2

Java Date API 早已被批评,例如此线程

您可能想查看Joda-TimeApache Commons Lang以获取替代的日期/时间实用程序。