我来自c#世界,所以对Java还不是很有经验。Eclipse刚刚告诉我Date已弃用:

Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));

为什么?应该用什么(尤其是在上述情况下)来代替呢?


当前回答

我偶然发现这个问题是一个新问题的重复,该问题询问在特定的年、月和日获得日期的非弃用方法是什么。

到目前为止,这里的答案是使用Calendar类,这在Java 8出现之前是正确的。但是从Java 8开始,这样做的标准方法是:

LocalDate localDate = LocalDate.of(1985, 1, 1);

如果你真的需要java。util。约会,你可以使用这个问题中的建议。

要了解更多信息,请查看Java 8的API或教程。

其他回答

不推荐使用构造函数的一个原因是year形参的含义不是您所期望的。javadoc说:

从JDK 1.1版开始,由Calendar取代。设置(年+ 1900,月,日期)。

请注意,year字段是自1900年以来的年份,因此您的示例代码很可能不会执行您期望的操作。这就是重点。

一般来说,Date API只支持现代西方日历,具有特殊指定的组件,并且在设置字段时行为不一致。

Calendar和GregorianCalendar api比Date更好,而第三方Joda-time api通常被认为是最好的。在Java 8中,他们引入了Java。时间包,现在这些是推荐的替代方案。

类似于binnyb的建议,您可以考虑使用较新的Calendar > GregorianCalendar方法。请看这些最新的文档:

http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html

new GregorianCalendar(1985, Calendar.JANUARY, 1).getTime();

(java -8之前的方式)

大多数Java开发人员目前使用第三方包Joda-Time。它被广泛认为是一个更好的实现。

Java 8将有一个新的Java .time。*包。请参阅本文,为JDK 8介绍新的日期和时间API。

您可以使用Calendar类在代码中创建类似new Date(年、月、日)的方法。

private Date getDate(int year,int month,int date){
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month-1);
    cal.set(Calendar.DAY_OF_MONTH, day);
    return cal.getTime();
}

它将像Date的已弃用构造函数一样工作