首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误java.time.format.DateTimeParseException:无法在索引10处找到未解析的文本

错误java.time.format.DateTimeParseException:无法在索引10处找到未解析的文本
EN

Stack Overflow用户
提问于 2016-08-19 07:35:54
回答 2查看 86.8K关注 0票数 24

我正在尝试使用LocalDateTime对下一个字符串进行对齐,但是我总是得到未解析的文本找到错误:

代码语言:javascript
运行
复制
Error java.time.format.DateTimeParseException: Text '2016-08-18 14:27:15.103+02' could not be parsed, unparsed text found at index 10

这是我的弦: convertDate:'2016-08-18 14:27:15.103+02

我的密码是:

代码语言:javascript
运行
复制
public static LocalDate conversorStringToLocalDateTime(String convertDate) throws ParseException {
    LocalDate dateTime =LocalDate.parse(convertDate);
    return dateTime;
}

我想不是太复杂,买我看不见错误。字符串中的+02是否是原因?

EN

Stack Overflow用户

回答已采纳

发布于 2016-08-27 20:12:54

tl;dr

代码语言:javascript
运行
复制
OffsetDateTime odt = OffsetDateTime.parse ( "2016-08-18 14:27:15.103+02" , DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" ) ) ;

详细信息

对于这个问题,格雷格-449的答复是正确的(对日期时间值使用仅日期对象),但不使用解决方案。

这个答案使用LocalDateTime,它不必要地丢弃关于与世界协调时相抵的有价值的信息。LocalDateTime并不表示时间线上的特定时刻,只是对可能的时刻的模糊概念,取决于调整到特定的时区。

+02是一个与世界协调时相抵,意思是“比UTC早两个小时”。所以在UTC,这个同时时刻的一天的时间是12小时,比你的14小时少2小时。这确实代表了时间线上的一个特定时刻。这个偏移量是您用LocalDateTime而不是OffsetDateTime丢弃的有价值的信息。

字符串的格式为SQL格式,接近标准的ISO 8601格式。只需将中间的空格替换为T即可。默认情况下,java.time类使用ISO8601格式,因此不需要指定格式模式。

代码语言:javascript
运行
复制
String input = "2016-08-18 14:27:15.103+02";
String inputModified = input.replace ( " " , "T" );

不幸的是,Java 8在解析偏移量值(缩写为一个小时)或偏移量值(在小时和分钟之间省略冒号)方面存在缺陷。修正了Java 9,但是在Java 8中,我们需要调整输入。

代码语言:javascript
运行
复制
// Workaround for Java 8 where 2-digit offset fails parsing. Fixed in Java 9.
int lengthOfAbbreviatedOffset = 3;
if ( inputModified.indexOf ( "+" ) == ( inputModified.length () - lengthOfAbbreviatedOffset ) ) {
    // If third character from end is a PLUS SIGN, append ':00'.
    inputModified = inputModified + ":00";
}
if ( inputModified.indexOf ( "-" ) == ( inputModified.length () - lengthOfAbbreviatedOffset ) ) {
    // If third character from end is a PLUS SIGN, append ':00'.
    inputModified = inputModified + ":00";
}

现在解析。

代码语言:javascript
运行
复制
OffsetDateTime odt = OffsetDateTime.parse ( inputModified );

转储到控制台。注意如何将+02转换为+02:00

代码语言:javascript
运行
复制
System.out.println ( "input: " + input + " | inputModified: " + inputModified + " | odt: " + odt );

输入: 2016-08-18 14:27:15.103+02 inputModified: 2016-08-18T14:27:15.103+02:00xODT:2016-0818T14:27:15.103+02:00

或者,指定格式设置模式。使用此格式模式时,偏移量解析错误不会造成影响。

代码语言:javascript
运行
复制
    DateTimeFormatter f = DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" );
    OffsetDateTime odt = OffsetDateTime.parse ( input , f );

数据库

来自波斯特格斯,您应该以日期时间对象而不是字符串的形式检索值。

如果您的JDBC驱动程序符合JDBC4.2,则可以调用ResultSet::getObject来获取InstantOffsetDateTime。如果没有,请调用ResultSet::getTimestamp以获取java.sql.Timestamp,然后通过调用时间戳对象上的toInstant立即转换为java.time。

在您的业务逻辑中坚持使用java.time;简要地使用java.sql类型,并且只用于与数据库进行交换。

票数 21
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39033525

复制
相关文章

相似问题

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