2016-08-19 590 views
4

我正尝试填写Flash使用LocalDateTime下一个字符串,但我总是去未解析文本中找到的错误:错误java.time.format.DateTimeParseException:无法解析,索引10发现未解析文本

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年8月18日14:27:15.103 + 02'

而且我的代码:

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

我想是不是太ç omplicated,买我无法看到错误。字符串中的+02是否是原因?

+0

我认为是日期和时间之间的空间。这是一个空间字符还是一个不间断的空间?如果你的字符串来自某种形式的表单,那么它可能与空间不同,而不是字符 –

+0

它来自Postgre数据库 –

回答

2

TL;博士

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

详细

Answer by greg-449是关于问题(使用了日期时间值的日期,仅对象),但不是解决正确。

该答案使用LocalDateTime,这会不必要地丢弃有关offset-from-UTC的宝贵信息。 A LocalDateTime确实不是代表时间线上的特定时刻,只是关于可能时刻的模糊想法,取决于调整到特定时区。

+02offset-from-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"); 

不幸的是,爪哇8具有在解析缩写为只是一个小时的偏移值或偏移值省略小时和分钟之间的冒号的错误。在Java 9中已修复。但在Java 8中,我们需要调整输入。

// 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); 

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

System.out.println ("input: " + input + " | inputModified: " + inputModified + " | odt: " + odt); 

input: 2016-08-18 14:27:15.103+02 | inputModified: 2016-08-18T14:27:15.103+02:00 | odt: 2016-08-18T14:27:15.103+02:00

或者,指定的格式设置模式。使用这种格式化模式时,偏移解析错误不会引起误解。

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

数据库

Postgres来了,你要检索值的日期时间对象,而不是字符串。

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

坚持与java.time为您的业务逻辑;简要使用java.sql类型,仅用于与数据库交换。

5

你的代码使用LocalDate只解析日期 - 不是一个日期和时间解析发现的日期后的空间,让你得到一个错误。

因此,您应该使用LocalDateTime,但LocalDateTime.parse(String)预计ISO格式日期不是您正在使用的格式。

因此,您需要使用DateTimeFormatter来指定输入字符串的格式。喜欢的东西:

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSX"); 
LocalDateTime result = LocalDateTime.parse(convertDate, format); 
+0

是的!这工作!我曾尝试过使用LocalDateTime,但使用了DateTimeFormatter。谢谢:) –