2013-04-10 52 views
6

我想解析StringYYYY-MM-dd HH:mm)到Date,但是得到的錯誤日期比預期的要晚。SimpleDateFormat解析「YYYY-MM-dd HH:mm」時產生錯誤的日​​期時間

CODE:

Date newDate = null; 
String dateTime = "2013-03-18 08:30"; 
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH); 
df.setLenient(false); 
try { 
    newDate = df.parse(dateTime); 
} catch (ParseException e) { 
    throw new InvalidInputException("Invalid date input."); 
} 

產地:

太陽12月30日08:30:00 EST 2012(錯誤)

我試着設置從寬關閉,但沒有運氣。

更新

感謝Sudhanshu的答案,它幫助我解決了Java轉換。當我將上述代碼的返回日期輸入到數據庫中時,我得到的日期正確,但時間始終爲00:00

ps.setDate(3, new java.sql.Date(app.getDate().getTime())); 
+0

對於更新,'java.sql.Date'僅僅是爲了一個日期,意味着SQL日期數據類型。從文檔:「要符合SQL DATE的定義,由java.sql.Date實例包裝的毫秒值必須通過在特定時區將小時,分鐘,秒和毫秒設置爲零來」標準化「哪個實例關聯。「 – 2017-06-21 18:22:25

回答

32

YYYY應該是YYYY-

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH); 

請查看文檔的SimpleDateFormat這裏
的Java 6:http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
的Java 7:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

+0

感謝您的回答。我解決了最初的問題。當我將數值輸入數據庫時​​,我正確地獲取日期,但時間始終爲00:00。 ps.setDate(3,new java.sql.Date(app.getDate()。getTime())); – Sas 2013-04-10 04:50:31

6

使用小case Y,沒有上限。即YYYY不YYYY

查看這裏的意見:Java Simple Date Format和其他引用那裏的答案。

4

有兩個問題。

  1. 格式字符串應該是"yyyy-MM-dd HH:mm"
  2. 數據庫中存儲時間的數據類型爲TimeStamp而不是Date

改正這兩件事情,你將能夠存儲和檢索日期與時間。

1

這是現代的答案。其他答案在2013年編寫時是很好的答案。在那之後,現代日期和時間API作爲舊類Date,SimpleDateFormat和朋友的替代品出現。恕我直言,你應該現在使用新的類。他們更適合程序員。

LocalDateTime newDate = null; 
    String dateTime = "2013-03-18 08:30"; 
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH); 
    try { 
     newDate = LocalDateTime.parse(dateTime, dtf); 
    } catch (DateTimeParseException e) { 
     throw new InvalidInputException("Invalid date input."); 
    } 

除了類名以外,它與舊代碼沒什麼不同。與其他示例會有差異,通常現代類將提供更清晰的代碼和更少的錯誤機會。

只是一個差的小示範,讓我們試試你它與大寫YYYY格式模式字符串:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH); 

現在的代碼拋出一個java.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type java.time.format.Parsed。我知道這很長。要注意的是,它提到的字段中沒有一年,只有一個WeekBasedYear。這是不一樣的;你現在可能已經發現這正是因爲大寫Y是以周爲基礎的年份(對於一週的數字只有很少用),在那裏你應該使用年份小寫字母y。我認爲這種行爲比舊的班級有更多的幫助:他們給了你一個錯誤的結果,假裝一切都很好,並且讓你完全處於黑暗中,不知道什麼是錯的。

接下來我明白,你想你的日期時間存儲到數據庫中。在過去,你會轉換爲一些適當的java.sql類型。不再需要。我相信你可以使用JDBC 4.2驅動程序:

ps.setObject(3, newDate); 

雖然我還沒有用數據庫測試過。請注意,您使用setObject()而不是setDate()