簡體   English   中英

SimpleDateFormat“Unparseable date”異常

[英]SimpleDateFormat “Unparseable date” Exception

我試圖用SimpleDateFormat.parse()解析日期時間字符串,但我一直收到Unparseable日期異常。

這是我要解析的日期格式: 2011-10-06T12:00:00-08:00

這是我正在使用的代碼:

try {
    String dateStr = "2011-10-06T12:00:00-08:00";
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy");
    Date date = dateParser.parse(dateStr);
    System.out.println(dateFormatter.format(date));         
} catch(Exception e) {
    System.out.println(e.getMessage());
}

返回此錯誤: java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

據我所知,這是使用SimpleDateFormat類的正確方法,但我不能流利使用Java,所以我可能會弄錯。 誰知道我的問題是什么?

時區應該是GMT-08:00或-0800(正如Madcore Tom所說)。 請參閱Java文檔

在Java 7中,您可以使用“yyyy-MM-dd'T'HH:mm:ssX”

我相信SimpleDateFormat不會解析帶有冒號的時區(-08:00)。 它應該能夠解析日期2011-10-06T12:00:00-0800

一些簡單的字符串操作應該可以幫助你擺脫冒號。

首先需要格式化"2011-10-06T12: 00: 00-08: 00"

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ");

之后,創建所需格式化的格式化。 例如: SimpleDateFormat fmt = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss");

並在解析了日期之后。 例如: Date date = dateParser.parse (dateFormat); 並且打印日期格式化。

下面是一個完整的例子。

String dataStr = "2011-10-06T12: 00: 00-08: 00";
SimpleDateFormat dataParser = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss", Locale.US);
Date date;
Try {
date = dataParser.parse (dataStr);
System.out.println (dateFormatter.format (date));

} cath (ParseException e) {

}

TL;博士

OffsetDateTime.parse( "2011-10-06T12:00:00-08:00" ) 
    .format( 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( Locale.US )  // Or Locale.CANADA_FRENCH and such.
    )

2011年10月6日

java.time

現代方法使用java.time類來取代麻煩的舊遺留日期時間類。

輸入字符串的格式符合ISO 8106標准。 在解析/生成字符串時,java.time類默認使用這些標准格式。 因此無需指定格式化模式。

解析為OffsetDateTime因為您的輸入字符串包含從UTC的偏移而不是時區。

OffsetDateTime odt = OffsetDateTime.parse( "2011-10-06T12:00:00-08:00" ) ;

odt.toString():2011-10-06T12:00-08:00

生成所需格式的字符串。 讓java.time自動本地化而不是硬編碼格式化模式。

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( Locale.US );  // Or Locale.CANADA_FRENCH and such.
String output = odt.format( f );

輸出:2011年10月6日

將日期時間值作為文本格式化時,請使用標准ISO 8601格式而不是本地化格式。

String output = odt.toLocalDate().toString() ;

2011-10-06


關於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 ,和更多

對於像2013-06-28T00:00:00+00:00這樣的日期格式,此代碼應該有效:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

我相信大多數人都對SimpleDateFormat無法處理ISO8601格式這一事實感到沮喪。 這是解決這種麻煩的小技巧。

創建一個知道格式的列表,您知道將用於您的應用程序並將SimpleDateFormat應用於列表。 現在,在你的formatDate()方法中,簡單地嘗試所有已知的格式並捕獲異常,然后如果仍然沒有日期,只需使用

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime();
if (d == null)
try {
    SimpleDateFormater ...
}

嘗試一下,看看是否有效。 有關更多信息在Java中使用時區轉換日期格式的簡單技巧!

試試吧

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");

我強烈建議使用JodaTime來做這類事情。

您正在嘗試解析ISO日期格式,而Joda會“開箱即用”,並且還會為您提供許多其他好處。

我很久以前就放棄了嘗試獲取標准的JDK數據類來做有用的事情。

暫無
暫無

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

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