日期格式异常

时间:2017-02-19 13:24:43

标签: 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 parsedDate = formatter.parse(date);
        tt =  parsedDate.getTime();
    } catch (ParseException e) {
        System.out.println(e);
        tt = (long) 9999999;
    }

    System.out.println(tt);

输出:

  

java.text.ParseException:Unparseable date:“2017-02-19T12:23:37.000000-00:00”

     

9999999

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您的毫秒部分有6位数而不是3位,时区不是作为RFC 822时区而是作为ISO 8601时区。

这将有效:

"yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"

正如评论中正确指出的那样,如果它偏离000000,这将会使毫秒部分变得黯然失色。

从Java 8开始,有一种更好的方法来解析日期和时间。对于您的ISO-8601日期,只需使用:

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

另请参阅Basil Bourque's great answer以获取更详细的说明。

答案 1 :(得分:2)

TL;博士

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

使用java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

毫秒与纳秒

遗留类仅支持milliseconds分辨率,限制为小数秒的三位小数。 java.time类使用nanoseconds分辨率,最多为小数秒的九位小数。您的小数点后六位的示例数据适用于microseconds

ISO 8601

您的输入字符串恰好采用标准ISO 8601格式。

嗯,差不多标准:你的例子有一个负零offset-from-UTC。 ISO 8601标准明确禁止负零偏移。标准要求零偏移标记为带有+符号而非-符号的正数。然而,声称是ISO 8601的个人资料的RFC 3339违反了这一规则,不幸的和不明智的选择是不同的内涵。

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

OffsetDateTime

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

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

请参阅此code run live at IdeOne.com

  

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

请注意OffsetDateTime::toString生成字符串时OffsetDateTime使用ISO 8601格式。最后的ZZulu的缩写,意为UTC

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

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

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

有关详细信息,请查看文档示例here