首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java8中将日期从ISO8601Zulu字符串转换为java.time.Instant

在Java8中将日期从ISO8601Zulu字符串转换为java.time.Instant
EN

Stack Overflow用户
提问于 2018-08-19 00:34:24
回答 2查看 11K关注 0票数 9

我想将字符串日期格式转换为java.time.Instant

解析日期时出现异常。

代码语言:javascript
复制
 java.lang.IllegalArgumentException: Too many pattern letters: s

我使用下面的代码进行转换,首先从字符串到日期。

代码语言:javascript
复制
    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,但无法正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-19 03:07:43

tl;dr

将字符串日期格式转换为java.time.Instant

跳过格式化模式。解析就行了。

代码语言:javascript
复制
Instant.parse( "2018-07-17T09:59:51.312Z" )

ISO 8601

是的,您使用了first Answer中指示的不正确的格式模式。

但是根本不需要指定格式化模式。您的输入字符串为标准ISO 8601格式。在解析/生成字符串时,java.time类默认使用ISO8601格式。

末尾的ZUTC的意思,发音是“Zulu”。

代码语言:javascript
复制
Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;

关于java.time

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在maintenance mode中的项目建议迁移到java.time类。

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java9添加了一些次要功能和fixes.

  • 和.

中的

  • 许多java.time功能已向后移植到Java6和7

    • 更高版本的Android捆绑实现的java.time类。
    • 对于较早的Android (<26),项目适配 (如上所述)。请参阅.

项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

票数 19
EN

Stack Overflow用户

发布于 2018-08-19 03:09:04

不要构建自己的格式化程序

不要纠结于编写你自己的格式模式字符串。您的字符串是内置在java.time中的ISO8601格式。解析为java.time.Instant (如标题所示):

代码语言:javascript
复制
    String string = "2018-07-17T09:59:51.312Z";
    Instant inst = Instant.parse(string);
    System.out.println(inst);

输出:

2018-07-17T09:59:51.312Z

要解析成LocalDate (正如您的代码片段所预期的那样):

代码语言:javascript
复制
    LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(date);

2018-07-17

你的代码出了什么问题?

格式模式字母区分大小写(您也可以从链接到的问题的第一个答案中的表中看到这一点)。

  • 你使用大写YYYY已有一年了。大写Y表示周年份,仅适用于周数字。对于year.
  • Uppercase DD表示一年中的某一天,请使用uuuu或小写yyyy。对于月份中的某一天,您需要小写的dd.
  • Lowercase hh表示小时,AM或PM的值从01到12,并且仅对AM/PM标记有用。你需要用大写的HH表示从00到23的一天中的某一小时。
  • 最终你正确地使用了小写的ss表示秒,但也使用了sss表示秒的零点数。对于后者,您需要大写的SSS。这个错误是你的错误消息的原因:因为秒数只有60 (包括一个闰秒),所以sss中的三个s是没有意义的,并且DateTimeFormatter对象。从文档中:

最多可以指定两个字母'd‘、'H’、'h‘、'K’、'k‘、'm’和's‘。

链接:DateTimeFormatter documentation

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51910640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档