我正在尝试使用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是否是原因?
发布于 2016-08-27 20:12:54
tl;dr
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格式,因此不需要指定格式模式。
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 );
输入: 2016-08-18 14:27:15.103+02 inputModified: 2016-08-18T14:27:15.103+02:00xODT:2016-0818T14:27:15.103+02:00
或者,指定格式设置模式。使用此格式模式时,偏移量解析错误不会造成影响。
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH:mm:ss.SSSX" );
OffsetDateTime odt = OffsetDateTime.parse ( input , f );
数据库
来自波斯特格斯,您应该以日期时间对象而不是字符串的形式检索值。
如果您的JDBC驱动程序符合JDBC4.2,则可以调用ResultSet::getObject
来获取Instant
或OffsetDateTime
。如果没有,请调用ResultSet::getTimestamp
以获取java.sql.Timestamp
,然后通过调用时间戳对象上的toInstant
立即转换为java.time。
在您的业务逻辑中坚持使用java.time;简要地使用java.sql类型,并且只用于与数据库进行交换。
https://stackoverflow.com/questions/39033525
复制相似问题