2010-04-21 76 views
27

我试图做一些非常简单的事情,但开始意识到在Java中的日期是雷区的一点。我只想通过三个整数(一年,一个月和一个日期)的组合来创建一些Date对象,对它们进行一些简单的测试(沿着日期A之前的B日期和1990年1月1日之后),将它们转换为java.sql.Date对象并通过JDBC将它们传递给数据库。什么是接受的方式来替换java.util.Date(年,月,日)

所有非常简单,使用java.util.Date(int year,int month,int day)构造函数工作正常。当然,这个构造函数是折旧的,我想避免在我写的新代码中使用折旧的调用。然而,解决这个简单问题的所有其他选项似乎都很复杂。是否真的没有简单的方法来做我想要的,而不使用折旧的构造函数?

我知道所有Java日期相关问题的标准答案是“使用joda时间”,但我真的不希望开始拉扯第三方库来处理这样一个看似微不足道的问题。

+2

译文:“......但我真的很想假装JDK类不可能像大家所说的那样搞砸了。” – 2010-04-22 14:16:44

回答

34

的想法是使用Calendar类,像这样:

Calendar cal = Calendar.getInstance(); 
cal.set(year, month, date); 
Date date = cal.getTime(); 

事实上,如果你检查你提constructor的Javadoc中,正是建议什么:

Date(int year, int month, int date) 
      Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date) or GregorianCalendar(year + 1900, month, date). 

或...使用JodaTime :-)。

+4

+1 JodaTime,以及每当发生时检查JDK 7。 – 2010-04-21 22:55:28

+2

这是日历中的其中一个陷阱 - 使用此代码不会得到相同的结果,因为日历将使用此代码保留其时间组件。您将不得不直接使用GregorianCalendar构造函数来避免时间问题,或者明确地清除所有时间字段。 – Yishai 2013-09-30 13:58:17

4

那么,你可以使用不赞成的构造函数。它已被弃用超过13年,仍然有效 - 它不会去任何地方。如果您不想这样做,并且不想使用第三方库,则必须使用日历。

在Java 7中,希望有一个新的时间API,并且您不再需要第三方API。

+2

不是Java 7,但Java 8具有新的时间API:https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html – 2015-04-16 14:01:31

1

LG的回答是有效的,但是一般情况下,您应该使用Calendar来处理所有日期操作,并且将Date从其中清除,除非您的API明确要求。在这种情况下,您可以在将它传递给API时将其转换。

相关问题