【问题标题】:java.text.Parse Exception : Unparseable Datejava.text.Parse 异常:无法解析的日期
【发布时间】:2014-06-12 19:18:52
【问题描述】:

我有以下代码:

  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)

【问题讨论】:

  • 尝试单引号'Z' SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  • 您要使用 ISODateTimeFormat(在 joda 中)吗?对于那个 ISO8601 标准可能会更好。见stackoverflow.com/questions/5393847/…

标签: java parsing date iso8601


【解决方案1】:

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 表示祖鲁时间,请在构造SimpleDateFormat 时将其添加为时区

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

【讨论】:

  • 我将添加更改 ModifiedDate 以获取时区差异,例如 '2001-07-04T12:08:56.235-0700' SampleDateFormat Examples section
  • @gtgaxiola 当然,如果 OP 可以更改他们的输入字符串,那么这样做可能会更容易。
【解决方案2】:

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

乔达时间

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

您使用的格式由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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多