我想将字符串日期格式转换为java.time.Instant
解析日期时出现异常。
java.lang.IllegalArgumentException: Too many pattern letters: s
我使用下面的代码进行转换,首先从字符串到日期。
String string = "2018-07-17T09:59:51.312Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD'T'hh:mm:ss.sssZ", Locale.FRANCE);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date);
我想转换"timestamp":"2018-07-17T09:59:51.312Z"
格式的时间在国际标准化组织8601格式的YYYY-MM-DDThh:mm:ss.sssZ
在世界协调时。
已检查Java string to date conversion,但无法正常工作。
发布于 2018-08-19 03:07:43
tl;dr
将字符串日期格式转换为java.time.Instant
跳过格式化模式。解析就行了。
Instant.parse( "2018-07-17T09:59:51.312Z" )
ISO 8601
是的,您使用了first Answer中指示的不正确的格式模式。
但是根本不需要指定格式化模式。您的输入字符串为标准ISO 8601格式。在解析/生成字符串时,java.time类默认使用ISO8601格式。
末尾的Z
是UTC的意思,发音是“Zulu”。
Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;
关于java.time
框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
现在在maintenance mode中的项目建议迁移到java.time类。
要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*
类。
从哪里获取java.time类?
中的
项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
和more。
发布于 2018-08-19 03:09:04
不要构建自己的格式化程序
不要纠结于编写你自己的格式模式字符串。您的字符串是内置在java.time中的ISO8601格式。解析为java.time.Instant
(如标题所示):
String string = "2018-07-17T09:59:51.312Z";
Instant inst = Instant.parse(string);
System.out.println(inst);
输出:
2018-07-17T09:59:51.312Z
要解析成LocalDate
(正如您的代码片段所预期的那样):
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(date);
2018-07-17
你的代码出了什么问题?
格式模式字母区分大小写(您也可以从链接到的问题的第一个答案中的表中看到这一点)。
YYYY
已有一年了。大写Y
表示周年份,仅适用于周数字。对于year.DD
表示一年中的某一天,请使用uuuu
或小写yyyy
。对于月份中的某一天,您需要小写的dd
.hh
表示小时,AM或PM的值从01到12,并且仅对AM/PM标记有用。你需要用大写的HH
表示从00到23的一天中的某一小时。ss
表示秒,但也使用了sss
表示秒的零点数。对于后者,您需要大写的SSS
。这个错误是你的错误消息的原因:因为秒数只有60 (包括一个闰秒),所以sss
中的三个s
是没有意义的,并且DateTimeFormatter
对象。从文档中:最多可以指定两个字母'd‘、'H’、'h‘、'K’、'k‘、'm’和's‘。
https://stackoverflow.com/questions/51910640
复制相似问题