为什么日期构造函数被废弃了,我应该使用什么代替它?

272

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

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

为什么?在这种情况下应该使用什么替代方案?


53
我正在经历类似的学习曲线,也是从C#转向Java。另一个让我遇到麻烦的问题是月份是基于0的系统(从0到11,其中1月= 0,12月= 11),但日期是基于1的系统(从1到31)。请注意这一点! - Paul Sasik
3
@Paul Sasik,是的,但例如有Calendar.JANUARY常量,以及每个月份都有一个对应的常量。 - Diogo
8
@PaulSasik 哈哈,是啊,Java 真是太烦了。不得不从 C# 转到 Java,简直是痛苦不堪。 - cbmeeks
2
可能是 为什么大多数 java.util.Date 方法已被弃用? 的重复提问。 - Thomas
11
C# 程序员用嘲讽的语气对 Java 发表了一些“lol”的评论,但这让我笑了,因为 .Net 借鉴了 Java 出色的时间日期库 Joda-Time,并推出了一个像样的日期时间库 Noda Time。请参考链接:Noda TimeJoda-Time - Basil Bourque
显示剩余6条评论
14个回答

2

2

我从Java安全编码指南中得到了这个。

本节中的示例广泛使用java.util.Date,因为它是可变API类的示例。在应用程序中,最好使用新的Java日期和时间API(java.time.*),该API已被设计为不可变。


2

使用Calendar类,你可以在代码中创建一个类似new Date(year,month,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 构造函数一样工作。

1
这些非常麻烦的类在多年前被现代的java.time类所取代,特别是InstantZonedDateTime - Basil Bourque
以上的解决方案应该将年份加上1900,不应该从月份中减去1,并且在Calendar.getInstance()行之后应该运行cal.clear(),以便将小时/分钟/秒/毫秒清零(就像在Date构造函数中一样)。 - Joel Richard Koett

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

(Java 8之前的方式)


这可能是在没有java.time的情况下你所能做到的最好了。然而,在Java 8之前,你也可以使用java.time,有一个后移库:ThreeTen Backport库 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接