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

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

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


当前回答

请注意,Calendar.getTime()是不确定的,因为白天时间部分默认为当前时间。

为了重现,试着运行下面的代码几次:

Calendar c = Calendar.getInstance();
c.set(2010, 2, 7); // NB: 2 means March, not February!
System.err.println(c.getTime());

如输出。

Sun Mar 07 10:46:21 CET 2010

几分钟后运行完全相同的代码会得到:

Sun Mar 07 10:57:51 CET 2010

因此,虽然set()强制对应的字段为正确的值,但它泄漏了其他字段的系统时间。(以上使用Sun jdk6和jdk7进行测试)

其他回答

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

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

不建议使用特定的Date构造函数,而应该使用Calendar。 JavaDoc for Date描述了哪些构造函数不推荐使用,以及如何使用Calendar替换它们。

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

(java -8之前的方式)

您可以使用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的已弃用构造函数一样工作

Date本身没有被弃用。它的很多方法都是。详情请看这里。

请改用java.util.Calendar。