[英]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) {
}
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類來取代麻煩的舊遺留日期時間類。
輸入字符串的格式符合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 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
,和更多 。
對於像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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.