繁体   English   中英

java.text.Parse 异常:无法解析的日期

[英]java.text.Parse Exception : Unparseable Date

我有以下代码:

  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模式后者表示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"));;

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

乔达时间

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

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

java.时间

现代日期时间 API于 2014 年 3 月与 Java-8 一起发布,取代了旧日期时间 API( java.util日期时间 API 及其格式SimpleDateFormat )。 从那时起,强烈建议停止使用容易出错的遗留 API 并切换到java.time API。

使用java.time API 的解决方案java.time API 基于ISO 8601 ,因此您不需要DateTimeFormatter来解析已经采用 ISO 8601 格式的日期时间字符串(例如,您的日期时间字符串, 1993-06-08T18:27:02.000Z )。

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

class Main {
    public static void main(String[] args) {
        String strModifiedDate = "1993-06-08T18:27:02.000Z";
        Instant instant = Instant.parse(strModifiedDate);
        System.out.println(instant);

        // It can also be directly parsed into a ZonedDateTime
        ZonedDateTime zdt = ZonedDateTime.parse(strModifiedDate);
        System.out.println(zdt);

        // or even into an OffsetDateTime
        OffsetDateTime odt = OffsetDateTime.parse(strModifiedDate);
        System.out.println(odt);
    }
}

Output :

1993-06-08T18:27:02Z
1993-06-08T18:27:02Z
1993-06-08T18:27:02Z

如果出于任何原因,您需要java.util.Date实例,您可以通过以下方式获取它:

Date date = Date.from(instant);

Trail:Date Time了解有关现代日期时间 API 的更多信息。

只是为了完整性:

这是使用遗留日期时间 API 的解决方案。首先,请注意'Z' 与 Z 不同 'Z'只是一个字符文字,而Z是零时区偏移量(或 UTC)的时区指示符。 因此,永远不要在日期时间格式/解析模式中使用'Z' 否则,它将仅被解释为文字字符,而不是时区指示符。

时区偏移量模式中使用的正确字母是X

演示

class Main {
    public static void main(String[] args) throws ParseException {
        String strModifiedDate = "1993-06-08T18:27:02.000Z";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
        Date modifiedDate = sdf.parse(strModifiedDate);
        System.out.println(modifiedDate);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM