不推荐使用java.util.Date类的参数化构造函数。 有什么选择?

我可以用什么来代替这个new Date(2009, 12, 9)

谢谢你的帮助。

理想情况下,请使用Joda Time 。 它是内置的无限优越的API。 然后,您需要根据您的具体要求在LocalDateTimeDateTime之间进行选择(这是一个复杂的领域 – 我不会尝试用一两句话来概括,但文档做得很好)。

如果绝对必要,请使用java.util.Calendar并在需要时将其转换为Date

日历!

 Calendar cal = Calendar.getInstance(); cal.set(2009, Calendar.DECEMBER, 12); 

请注意,我没有把12月份放到12月,因为它实际上是11(1月是0)。

然后,您可以轻松地添加或删除秒,分钟,小时,天,月或年:

 cal.add(Calendar.HOUR, 2); cal.add(Calendar.MONTH, -5); 

最后,如果你想要一个日期:

 cal.getTime(); 

如果您查看Javadoc,它会指向您使用日历 。

从JDK版本1.1开始,由Calendar.set(年份+ 1900,月份,日期,小时,分钟)或GregorianCalendar(年份+ 1900,月份,日期,小时,分钟)取代。

如果查看Date构造函数参数,您将看到它被弃用的原因:

参数:

 year - the year minus 1900. month - the month between 0-11. date - the day of the month between 1-31. hrs - the hours between 0-23. min - the minutes between 0-59. 

year不是你所期望的,也不是month

要表示您提到的日期,您需要像这样调用Date (不推荐)

 new Date(2009-1900, 12-1, 9) 

使用Calendar的替代方案是

 Calendar cal = Calendar.getInstance(); cal.set(2009, 11, 9); //year is as expected, month is zero based, date is as expected Date dt = cal.getTime(); 

您还可以使用SimpleDateFormat对象:

 import java.util.Date; import java.text.SimpleDateFormat; import java.text.ParseException; public class DateTest { public static void main( String [] args ) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy, MM, dd"); Date date = sdf.parse("2009, 12, 9"); System.out.println( date ); } } 

蒂姆,在你的评论中,你提到你在GXT环境中这样做 – 即在GWT客户端代码中。 GWT不支持GregorianCalendar,你很可能无法通过GWTC编译器放置JodaTime(你可以,但你真的想要)。

如果你想在GWT中进行日历操作,我认为你真的可以选择使用JNSI。 请参阅JavaScript中的Date类。

 GregorianCalendar(year + 1900, month, date) 

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html

不幸的是,Java中的日期支持非常糟糕。 正式地说,你可能不得不用日历来做这件事,但在我看来这不应该是必要的。 就像其他人提到的那样,Joda时间要好得多,但仍然不如Ruby on Rails中的日期那么容易使用。

我不知道任何Java软件包可以为你提供相当多的日期支持(Joda不尽如人意,但是很接近),但是在Groovy中,使用TimeCategory可以为你提供类似Ruby on Rails的日期支持。