[英]SimpleDateFormat not parsing date correctly
我很困惑為什么SimpleDateFormat
沒有正確解析以下輸入數據。
我試圖在String
上測試各種可能的允許日期格式,看看它是否會使用其中一種格式正確解析。
注意:我使用的其他不正確的日期格式報告了解析錯誤。 這就是我期望看到的。
我究竟做錯了什么? 或者,我可以做什么作為解決方法?
String dformat = "MM-dd-yyyy";
String cDate = "2013-12-28";
SimpleDateFormat f = new SimpleDateFormat(dformat);
Date dd = f.parse(cDate);
結果是成功。 並且解析的日期是:
日期:9月12日星期五00:00:00太平洋標准時間195
那么,日期應該是2013年12月28日 。 在這種情況下,我希望看到(就像我看到的其他無效格式):
java.text.ParseException: Unparseable date: "2013-12-28"
你應該考慮使用java.util.Date的新java 8版本,它是java.time.LocalDate和java.time.LocalDateTime作為SDK的一部分。 由於您遇到問題,這些Date API被認為更穩定。 這是一個例子。
String armisticeDate = "2013-12-28";
LocalDate aLD = LocalDate.parse(armisticeDate);
System.out.println("Date: " + aLD);
String armisticeDateTime = "2013-12-28T11:50";
LocalDateTime aLDT = LocalDateTime.parse(armisticeDateTime);
System.out.println("Date/Time: " + aLDT);
如果您想創建不同的格式,可以執行以下操作。
String anotherDate = "04 Apr 2016";
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd MMM yyyy");
LocalDate random = LocalDate.parse(anotherDate, df);
System.out.println(anotherDate + " parses as " + random);
有關完整文檔,請查看Oracle頁面。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
要獲取錯誤消息:
java.text.ParseException: Unparseable date: "2013-12-28"
你需要打電話:
f.setLenient(false);
正如parse(String source, ParsePosition pos)
的javadoc parse(String source, ParsePosition pos)
所說:
默認情況下,解析是寬松的:如果輸入不是此對象的格式方法使用的形式,但仍可以解析為日期,則解析成功。 客戶可以通過調用
setLenient(false)
堅持嚴格遵守格式。
你的代碼應該是這樣的:
String dformat = "yyyy-MM-dd";
String cDate = "2013-12-28";
SimpleDateFormat f = new SimpleDateFormat(dformat);
Date dd = f.parse(cDate);
您的問題中的日期格式有誤。
那么dformat不符合cDate格式。 所以你必須在dformat中提供cDate,或者你必須在“”yyyy-MM-dd中更改dformat“
您的格式模式和日期字符串不多。 改成:
String dformat = "yyyy-MM-dd";
嗯, SimpleDateFormat
被認為是一個有問題且有bug的類 ,有很多奇怪的行為 。
可能發生的事情類似於本文中描述的問題。 考慮您的模式和輸入:
MM-dd-yyyy
2013-12-28
它可能讀月份為“20”,白天為“3”,年份為“-28”? (或者其他一些值,因為我不確定它如何將2-28
解釋為4位數字)。 而這個混亂的最終結果是一個完全錯誤,奇怪的日期 - 並且不要問我它是如何得到最終結果的,這對我來說是個謎。
無論如何,當模式與輸入格式不匹配時會發生這種情況,並且SimpleDateFormat
讀取的實際值將是不可預測的並且有點違反直覺。 但真正重要的是這個類有很多問題和設計缺陷,而且默認情況下它很寬松,因此它會在發出錯誤之前嘗試“聰明”並做很多奇怪的事情。
如果要驗證輸入,只需通過調用f.setLenient(false)
關閉寬松模式,如Andreas建議的那樣。 當輸入與模式不匹配時,這將拋出異常。
但是如果您使用的是Java 8,那么您應該使用java.time API ,它遠遠優於它,它解決了SimpleDateFormat
帶來的許多問題。
要檢查字符串是否包含特定格式的日期,請使用java.time.format.DateTimeFormatter
。 默認情況下,此類不是寬容的SimpleDateFormat
,因此它應該按預期工作:
// use the format "month-day-year"
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM-dd-yyyy");
// try to parse a string in a different format (year-month-day)
LocalDate dt = LocalDate.parse("2013-12-28", fmt); // exception
上面的代碼嘗試創建一個LocalDate
,一個表示日期(僅日,月和年)的類。 但是,如果您只想驗證輸入(不將其分配給任何變量),您可以使用格式化程序:
fmt.parse("2013-12-28"); // exception
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.