我试图使用LocalDateTime传递下一个字符串,但我总是得到未解析的文本发现错误:
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是原因吗?
br
OffsetDateTime odt = OffsetDateTime.parse ( "2016-08-18 14:27:15.103+02" , DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" ) ) ;
<标题> 详细信息greg-449的答案对问题是正确的(使用日期-only对象作为日期-时间值),但不是解决方案。
那个答案使用了LocalDateTime
,这不必要地扔掉了关于从utc偏移的有价值的信息。LocalDateTime
不表示时间轴上的特定时刻,只是一个模糊的关于可能时刻的概念,取决于调整到特定的时区。
+02
是UTC的偏移量,意思是"比UTC早两个小时"。所以在UTC中,这个同时发生的时刻的时间是12小时,比你们的14小时少2小时。这个表示时间轴上的特定时刻。这个偏移量是您使用LocalDateTime
而不是OffsetDateTime
丢弃的有价值的信息。
您的字符串的格式是SQL格式,这是接近标准的ISO 8601格式。只需将中间的SPACE替换为T
。java。时间类默认使用ISO 8601格式,因此不需要指定格式模式。
String input = "2016-08-18 14:27:15.103+02";
String inputModified = input.replace ( " " , "T" );
不幸的是,Java 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
来获得Instant
或OffsetDateTime
。如果没有,调用ResultSet::getTimestamp
来获得java.sql.Timestamp
,然后立即转换为java。通过在Timestamp对象上调用toInstant
来设置时间。
坚持使用java。你的业务逻辑时间;使用java。SQL类型简单,仅用于与数据库交换。
标题>标题>您的代码正在使用LocalDate
,它只解析日期-而不是日期和时间,所以当解析找到日期后的空间时,您会得到一个错误。
所以你应该使用LocalDateTime
,但LocalDateTime.parse(String)
期望一个ISO格式的日期,而不是你正在使用的格式。
所以您需要使用DateTimeFormatter
来指定输入字符串的格式。比如:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSX");
LocalDateTime result = LocalDateTime.parse(convertDate, format);