簡體   English   中英

SimpleDateFormat無法正確解析日期

[英]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.

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