java.text.Parse异常:Unparseable Date

时间:2014-06-12 19:18:52

标签: java parsing date iso8601

我有以下代码:

  String ModifiedDate = "1993-06-08T18:27:02.000Z" ;  
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
  Date ModDate = sdf.parse(ModifiedDate);

即使我的日期格式很好,我也收到以下异常......

java.text.ParseException: Unparseable date: "1993-06-08T18:27:02.000Z"
at java.text.DateFormat.parse(DateFormat.java:337)

2 个答案:

答案 0 :(得分:10)

Z模式后者表示RFC 822时区。你的字符串

String ModifiedDate = "1993-06-08T18:27:02.000Z" ;  

不包含此类时区。它字面上包含Z

您希望与文字T类似的日期模式具有文字Z

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

如果您希望Z指示Zulu时间,请在构建SimpleDateFormat时将其添加为时区

sdf.setTimeZone(TimeZone.getTimeZone("Zulu"));;

答案 1 :(得分:0)

answer by Sotirios Delimanolis是正确的。 Z表示祖鲁时间,与UTC(+00:00)的零偏移。换句话说,没有调整到任何时区。

约达时间

仅供参考,Joda-Time库使这项工作变得更加轻松,java.time package中的新Java 8也是如此。

您使用的格式由ISO 8601标准定义。 Joda-Time和java.time都解析&默认情况下生成ISO 8601字符串。

Joda-Time中的DateTime知道自己指定的时区。因此,作为解析过程的一部分,请指定要调整的时区。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", timeZone );
String output = dateTime.toString();

如果需要,您可以将DateTime对象保留在Universal Time

DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", DateTimeZone.UTC );

当其他类需要时,您可以生成java.util.Date对象。

java.util.Date date = dateTime.toDate();