2010-04-21 72 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時將其轉換。

相關問題