[英]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月。
LocalDate.of( 2011 , 11 , 14 ) // November 14th, 2011
馬特·鮑爾的答案是正確的。 但是現在有一種改進的方法。
麻煩的舊日期時間類(例如Calendar
, java.util.Date
和java.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 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.