我想将字符串日期格式转换为java.time.Instant
解析日期时出现异常。
java.lang.IllegalArgumentException: Too many pattern letters: s
我正在使用以下代码首先从String转换为日期。
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);
我想以UTC时区的ISO 8601格式"2018-07-17T09:59:51.312Z"
转换格式为“ timestamp”:YYYY-MM-DDThh:mm:ss.sssZ
的时间。
已检查Java string to date conversion,但不起作用。
答案 0 :(得分:6)
将字符串日期格式转换为java.time.Instant
跳过格式设置模式。只是解析。
Instant.parse( "2018-07-17T09:59:51.312Z" )
是的,您使用了first Answer中指示的格式错误。
但是您根本不需要指定格式模式。您的输入字符串为标准ISO 8601格式。解析/生成字符串时, java.time 类默认使用ISO 8601格式。
最后的Z
表示UTC,发音为“祖鲁语”。
Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
不要费心编写自己的格式模式字符串。您的字符串采用java.time中内置的ISO 8601格式。解析为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
用于星期,仅与星期数一起使用。使用uuuu
或小写yyyy
作为年份。DD
适用于一年中的某天。对于一个月中的某天,您需要使用小写字母dd
。hh
在01到12的AM或PM上持续一个小时,仅与AM / PM标记一起使用。从00到23,您需要在一天的小时中使用大写字母HH
。最后,您正确使用了小写的ss
秒钟,但也使用了sss
的秒钟。对于后者,您需要大写的SSS
。此错误是您收到错误消息的原因:由于秒数最多只能达到60(包括a秒),因此s
中的三个sss
毫无意义,并且DateTimeFormatter
反对这个。从文档中:
最多可以指定两个字母“ d”,“ H”,“ h”,“ K”,“ k”,“ m”和“ s”。