我来自c#世界,所以对Java还不是很有经验。Eclipse刚刚告诉我Date已弃用:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
为什么?应该用什么(尤其是在上述情况下)来代替呢?
我来自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安全代码指南中得到了这个
本节中的示例广泛使用java.util.Date 一个可变API类的例子。在应用程序中是这样的 最好使用新的Java日期和时间API (Java . Time .*) 被设计为不可变的。
类似于binnyb的建议,您可以考虑使用较新的Calendar > GregorianCalendar方法。请看这些最新的文档:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
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。时间包,现在这些是推荐的替代方案。
大多数Java开发人员目前使用第三方包Joda-Time。它被广泛认为是一个更好的实现。
Java 8将有一个新的Java .time。*包。请参阅本文,为JDK 8介绍新的日期和时间API。