当前位置: 首页 > 知识库问答 >
问题:

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

龙飞
2023-03-14
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'

和我的代码:

public static LocalDate conversorStringToLocalDateTime(String convertDate) throws ParseException {
    LocalDate dateTime =LocalDate.parse(convertDate);
    return dateTime;
}

我想不是太复杂,买我看不出错误。字符串中的+02可能是原因吗?

共有1个答案

叶国兴
2023-03-14
OffsetDateTime odt = OffsetDateTime.parse ( "2016-08-18 14:27:15.103+02" , DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" ) ) ;

greg-449对这个问题的回答是正确的(使用日期对象作为日期时间值),但不是解决方案。

该答案使用LocalDateTime,这不必要地丢弃了关于从UTC偏移量的有价值的信息。LocalDateTime并不表示时间线上的特定时刻,只是关于可能时刻的模糊概念,这取决于调整到特定的时区。

+02是UTC的偏移量,意思是“比UTC提前两个小时”。所以在UTC中,这个同时时刻的一天中的时间是12小时,比你的14小时少2小时。这确实代表了时间线上的一个特定时刻。此偏移量是您使用localdatetime而不是offsetdatetime丢弃的有价值的信息。

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

String input = "2016-08-18 14:27:15.103+02";
String inputModified = input.replace ( " " , "T" );

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

// 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";
}
OffsetDateTime odt = OffsetDateTime.parse ( inputModified );
System.out.println ( "input: " + input + " | inputModified: " + inputModified + " | odt: " + odt );

或者,指定格式模式。当使用此格式模式时,偏移量解析错误不会产生影响。

    DateTimeFormatter f = DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" );
    OffsetDateTime odt = OffsetDateTime.parse ( input , f );

从Postgres中,您应该将值作为日期-时间对象而不是字符串来检索。

如果您的JDBC驱动程序符合JDBC4.2,则可以调用ResultSet::GetObject以获取即时offsetDateTime。如果没有,则调用ResultSet::GetTimestamp获取java.sql.Timestamp,然后通过调用Timestamp对象的Toinstant立即转换为java.time。

 类似资料: