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
确实不是代表时间线上的特定时刻,只是关于可能时刻的模糊想法,取决于调整到特定时区。
+02
是offset-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
以获得Instant
或OffsetDateTime
。如果没有,请致电ResultSet::getTimestamp
以获得java.sql.Timestamp
,然后通过在时间戳对象上调用toInstant
立即转换为java.time。
坚持与java.time为您的业务逻辑;简要使用java.sql类型,仅用于与数据库交换。
我认为是日期和时间之间的空间。这是一个空间字符还是一个不间断的空间?如果你的字符串来自某种形式的表单,那么它可能与空间不同,而不是字符 –
它来自Postgre数据库 –