簡體   English   中英

java.util.Date到java.sql.Date的轉換給出錯誤的月份

[英]java.util.Date to java.sql.Date conversion gives wrong month

考慮以下代碼段:

Calendar futureDate = Calendar.getInstance();
int year = 2011;
int month = 11;
int day = 14;
futureDate.set(year,month, day);
System.out.println(futureDate.toString());
java.sql.Date sqlDate  = new java.sql.Date( futureDate.getTime().getTime());

從futureDate.toString()的打印輸出為:

..... YEAR = 2011,月= 11,WEEK_OF_YEAR = 43,WEEK_OF_MONTH = 4,DAY_OF_MONTH = 14,DAY_OF_YEAR = 289,DAY_OF_WEEK = 1,DAY_OF_WEEK_IN_MONTH = 3,AM_PM = 0,HOUR = 11,HOUR_OF_DAY = 11,MINUTE = 32,SECOND = 51,微差= 117,ZONE_OFFSET = -18000000,DST_OFFSET = 3600000]

這表明Calendare對象保存了正確的日期。 但是,在轉換為sql日期並存儲在數據庫中(MySQL通過JDBC)之后,該日期的MySQL表顯示為“ 2011-12-14”,而不是“ 2011-11-14”。 我本來會懷疑語言環境和時區,但是這些會導致一天中的時間而不是日期的月份中出現差異。

關於我做錯了什么的任何線索?

Calendar#set(int, int, int)將month參數解釋為從零開始,因此futureDate.set(2011, 11, 14)將日歷的月份設置為12月。

TL;博士

LocalDate.of( 2011 , 11 , 14 )  // November 14th, 2011

細節

馬特·鮑爾的答案是正確的。 但是現在有一種改進的方法。

java.time

麻煩的舊日期時間類(例如Calendarjava.util.Datejava.sql.Date現在已被遺留,由java.time類取代。

與傳統類不同,java.time類具有合理的編號方式 ,例如1月至12月的月份為1-12 ,周一至星期日的月份為 1-7。

LocalDate類表示沒有日期和時區的僅日期值。

LocalDate ld = LocalDate.of( 2011 , 11 , 14 ) ;

或使用方便的Month枚舉。

LocalDate ld = LocalDate.of( 2011 , Month.NOVEMBER , 14 ) ;

使用支持JDBC 4.2和更高版本的JDBC驅動程序,您可以將java.time對象直接傳遞到數據庫。

myPreparedStatement.setObject( … , ld ) ;

提取時,請使用getObject

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM