如何将Timestamp
转换为保留时区的LocalDateTime
?
我尝试使用TimestampObject.toLocalDateTime().toLocalDate()
但是这不会保留时区。
答案 0 :(得分:2)
您应该使用正确的数据类型在数据库中存储时间戳。根据您的确切要求和RDBMS的功能,这可能是MS的timestamp with time zone
或datetimeoffset
。然后从Java存储OffsetDateTime
或仅Instant
个对象进入数据库并返回相同的类型。调用OffsetDateTime
因为它除了日期和时间之外还包含偏移量。它的方法toLocalDateTime
和toLocalDate
保留了偏移量,即它们给出的时间和日期与原始偏移量一致。 LocalDate
和LocalDateTime
都不能自己保留偏移或时区。如果可以,请避免使用过时的java.sql.Timestamp
课程。
您的字符串包括-0800
,与UTC的偏移量,然后是UTC
,这通常意味着从UTC偏移0,但在这种情况下可能意味着前者偏移量来自UTC。我希望你知道,因为我没有。偏移量与时区不同:时区包含其所代表位置的所有历史和已知的偏移变化。
假设您的数据库已经包含字符串(例如varchar
),您可以像这样获取日期,时间和偏移量:
DateTimeFormatter timestampFormatter = new DateTimeFormatterBuilder()
.appendPattern("d-MMM-uuuu h:mm ")
.parseCaseInsensitive()
.appendPattern("a")
.parseCaseSensitive()
.appendPattern(" xx 'UTC'")
.toFormatter(Locale.ROOT);
String timestampString = "30-Jan-2018 5:17 pm -0800 UTC someText";
ParsePosition pos = new ParsePosition(0);
OffsetDateTime dateTime
= OffsetDateTime.from(timestampFormatter.parse(timestampString, pos));
LocalDate date = dateTime.toLocalDate();
我考虑到字符串包含小写的am
或pm
,其中Java通常期望大写,通过解析该位不敏感,我检查文本{{1}在那里,但不要用它做任何事情。该代码段产生UTC
OffsetDateTime
,接下来2018-01-30T17:17-08:00
LocalDate
。