Java 日期格式异常

Java 日期格式异常,java,date,format,date-formatting,Java,Date,Format,Date Formatting,我有以下日期2017-02-19T12:23:37.000000-00:00 该代码: Long tt = null; String date = "2017-02-19T12:23:37.000000-00:00"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); try { Date pars

我有以下日期
2017-02-19T12:23:37.000000-00:00

该代码:

    Long tt = null;
    String date = "2017-02-19T12:23:37.000000-00:00";
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    try {
        Date parsedDate = formatter.parse(date);
        tt =  parsedDate.getTime();
    } catch (ParseException e) {
        System.out.println(e);
        tt = (long) 9999999;
    }

    System.out.println(tt);
输出:

java.text.ParseException:不可解析日期:“2017-02-19T12:23:37.000000-00:00”

9999999


谢谢您的帮助。

您的输入日期与您指定的模式不匹配。尝试更改模式:

    String date = "2017-02-19T12:23:37.000000-00:00";
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX");

有关详细信息,您可以查看文档示例。

您的输入日期与您指定的模式不匹配。尝试更改模式:

    String date = "2017-02-19T12:23:37.000000-00:00";
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX");

有关更多信息,您可以查看文档示例。

毫秒部分有6位数字而不是3位,并且时区不是作为RFC 822时区给出的,而是作为ISO 8601时区给出的

这将有助于:

"yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"
正如在评论中正确指出的那样,如果毫秒部分偏离
000000
,它将弄乱毫秒部分

由于Java8,有一种更好的方法来解析日期和时间。对于您的ISO-8601日期,只需使用以下内容:

OffsetDateTime.parse("2017-02-19T12:23:37.000000-00:00")

有关更详细的解释,请参见。

毫秒部分有6位数字,而不是3位,并且时区不是作为RFC 822时区给出的,而是作为ISO 8601时区给出的

这将有助于:

"yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"
正如在评论中正确指出的那样,如果毫秒部分偏离
000000
,它将弄乱毫秒部分

由于Java8,有一种更好的方法来解析日期和时间。对于您的ISO-8601日期,只需使用以下内容:

OffsetDateTime.parse("2017-02-19T12:23:37.000000-00:00")
有关更详细的说明,请参见。

tl;博士 使用java.time 您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java.time类取代

毫秒与纳秒 遗留类只支持分辨率,仅限于小数点后三位小数。time类使用分辨率,最多为小数点后九位小数。您的示例数据(小数点后六位)用于

ISO 8601 您的输入字符串恰好是标准格式

好的,几乎是标准的:你的例子有一个负零。ISO 8601标准明确禁止负零偏移。本标准要求零偏移标记为带有
+
符号的正数,而不是
-
符号。然而,它声称是ISO8601的一个概要文件,违反了这一规则,将不幸和不明智的选择视为不同的含义

在解析/生成字符串时,java.time类默认使用ISO 8601格式。所以根本不需要指定格式化模式

OffsetDateTime
幸运的是,该类在解析输入时容忍负零偏移量

String input = "2017-02-19T12:23:37.123456-00:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
看这个

odt.toString():2017-02-19T12:23:37.123456Z

请注意,当从我们的
OffsetDateTime
生成字符串时,
OffsetDateTime::toString
使用了ISO 8601格式。末尾的
Z
Zulu
的缩写,意思是


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 使用java.time 您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java.time类取代

毫秒与纳秒 遗留类只支持分辨率,仅限于小数点后三位小数。time类使用分辨率,最多为小数点后九位小数。您的示例数据(小数点后六位)用于

ISO 8601 您的输入字符串恰好是标准格式

好的,几乎是标准的:你的例子有一个负零。ISO 8601标准明确禁止负零偏移。本标准要求零偏移标记为带有
+
符号的正数,而不是
-
符号。然而,它声称是ISO8601的一个概要文件,违反了这一规则,将不幸和不明智的选择视为不同的含义

在解析/生成字符串时,java.time类默认使用ISO 8601格式。所以根本不需要指定格式化模式

OffsetDateTime
幸运的是,该类在解析输入时容忍负零偏移量

String input = "2017-02-19T12:23:37.123456-00:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
看这个

odt.toString():2017-02-19T12:23:37.123456Z

请注意,当从我们的
OffsetDateTime
生成字符串时,
OffsetDateTime::toString
使用了ISO 8601格式。末尾的
Z
Zulu
的缩写,意思是


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复