我有以下日期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
感谢您的帮助。
答案 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)
OffsetDateTime.parse( "2017-02-19T12:23:37.000000-00:00" )
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。
遗留类仅支持milliseconds分辨率,限制为小数秒的三位小数。 java.time类使用nanoseconds分辨率,最多为小数秒的九位小数。您的小数点后六位的示例数据适用于microseconds。
您的输入字符串恰好采用标准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格式。最后的Z
是Zulu
的缩写,意为UTC。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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。