2014-01-09 70 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

相关问题