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(如上所述)
- 看
+
符号的正数,而不是-
符号。然而,它声称是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添加了一些次要功能和修复