2014-01-09 63 views
2

爲什麼我在下面得到一個錯誤?它只發生在某些日期。Java無法使用SimpleDateFormat解析UTC日期

Helper.getDate("2014-01-09T17:10:14Z", "dd-MM-yyyy"); 

public static Date getDate(String date, String format) { 
    DateFormat df = new SimpleDateFormat(format); 

    try { 
     return df.parse(date); 
    } catch (ParseException e) { 
     log.error("getDate", e); 
    } 

    return null; 
} 
+0

你的格式有誤。 – SLaks

+0

你期望/希望代碼實際執行什麼? – Affe

+0

返回一個有效的Date對象。 –

回答

4

此日期:

"2014-01-09T17:10:14Z"

具有的格式 "yyyy-MM-dd'T'HH:mm:ss'Z'"

(或在Java 7中"yyyy-MM-dd'T'HH:mm:ssX"

所以當然就不可能解析它格式爲dd-MM-yyyy

格式化字符串需要與輸入兼容!

(注意我給了一個文字Z,這是回到兼容。Java 7的實際理解ISO8601,你可以使用X那裏有它實際上被解析。)

+0

這工作謝謝! –

0

該字符串2014-01-09T17:10:14Z是日期標準ISO 8601格式-times。

Joda-Time 2.3庫直接在它的DateTime構造函數中使用這樣的標準字符串。無需格式化器/解析器。

輕鬆一個襯...
(飼料標準的字符串爲DateTime的構造函數,那麼DateTime實例轉換爲java.util.Date實例)

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 
// import org.joda.time.*; 

java.util.Date date = new DateTime("2014-01-09T17:10:14Z").toDate(); 

轉儲到控制檯,並顯示DateTime值比較...

System.out.println("date: " + date); 
System.out.println("dateTime: " + new DateTime("2014-01-09T17:10:14Z")); 
System.out.println("dateTime in UTC: " + new DateTime("2014-01-09T17:10:14Z").toDateTime(DateTimeZone.UTC)); 

運行時...

date: Thu Jan 09 09:10:14 PST 2014 
dateTime: 2014-01-09T09:10:14.000-08:00 
dateTime in UTC: 2014-01-09T17:10:14.000Z 
0

已經有很多的答案,但只是想更新與java 8

一般來說,我們面臨着兩個問題,日期

  1. 解析字符串到日期
  2. 顯示日期在所需的字符串格式

DateTimeFormatter在Java中8類可用於這兩個目的。 下面的方法試圖爲這些問題提供解決方案。

方法1: 將您UTC字符串即時。使用即時您可以通過提供時區字符串爲任何時區創建日期,並根據需要使用DateTimeFormatter來格式化顯示日期。

String dateString = "2016-07-13T18:08:50.118Z"; 
String tz = "America/Mexico_City"; 
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a"); 
ZoneId zoneId = ZoneId.of(tz); 

Instant instant = Instant.parse(dateString); 

ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId); 
System.out.println(dateTimeInTz.format(dtf)); 

方法2:

使用DateTimeFormatter內置常量e.g ISO_INSTANT解析字符串LocalDateISO_INSTANT可以解析圖案的日期

YYYY-MM-dd'T'HH:MM:SSX例如'2011-12-03T10:15:30Z'

LocalDate parsedDate 
    = LocalDate.parse(dateString, DateTimeFormatter.ISO_INSTANT); 

DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("yyyy MM dd"); 
System.out.println(parsedDate.format(displayFormatter)); 

方法3 :

如果你的日期字符串有時間精度差不多例如,它捕獲的秒部分,以及在這種情況下2016-07-13T18:08:50.118Z則方法1將工作但方法2不起作用。如果你嘗試解析它將會拋出DateTimeException由於ISO_INSTANT格式化程序將無法解析秒數的小數部分,正如你可以從它的模式中看到的那樣。 在這種情況下,您將不得不通過提供如下日期模式來創建定製DateTimeFormatter

LocalDate localDate 
= LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")); 
+0

@BasilBourque感謝您指出。編輯:) – WitVault

相關問題