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

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

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


当前回答

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

(java -8之前的方式)

其他回答

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

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

Date构造函数期望年份的格式为1900年以来的年份、从零开始的月份、从一开始的日期,并将小时/分钟/秒/毫秒设置为零。

Date result = new Date(year, month, day);

因此,使用Calendar替换(从零开始的年,从零开始的月,从一开始的日)来替换已弃用的Date构造函数,我们需要这样的东西:

Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year + 1900, month, day);
Date result = calendar.getTime();

或者使用Java 1.8(年为0,月和日为1):

Date result = Date.from(LocalDate.of(year + 1900, month + 1, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

以下是Date、Calendar和Java 1.8的相同版本:

int year = 1985; // 1985
int month = 1; // January
int day = 1; // 1st

// Original, 1900-based year, zero-based month, one-based day
Date date1 = new Date(year - 1900, month - 1, day);

// Calendar, zero-based year, zero-based month, one-based day
Calendar calendar = Calendar.getInstance();
calendar.clear(); // Sets hours/minutes/seconds/milliseconds to zero
calendar.set(year, month - 1, day);
Date date2 = calendar.getTime();

// Java-time back to Date, zero-based year, one-based month, one-based day
Date date3 = Date.from(LocalDate.of(year, month, day).atStartOfDay(ZoneId.systemDefault()).toInstant());

SimpleDateFormat format = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.SSS");

// All 3 print "1985-Jan-01 00:00:00.000"
System.out.println(format.format(date1));
System.out.println(format.format(date2));
System.out.println(format.format(date3));

date类实际上并没有被弃用,只是该构造函数以及其他几个构造函数/方法被弃用了。它被弃用是因为这种用法与国际化不兼容。应该改为使用Calendar类:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1988);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date dateRepresentation = cal.getTime();

看看Javadoc的日期:

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

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

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

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

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

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

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

请改用java.util.Calendar。