如何将时间戳转换为保留时区的本地日期时间?



如何在保留时区的情况下将Timestamp转换为LocalDateTime

我尝试使用TimestampObject.toLocalDateTime().toLocalDate()但这不会保留时区。

您应该真正使用正确的数据类型来将时间戳存储在数据库中。根据您的确切要求和RDBMS的功能,例如,这可能是MS的timestamp with time zonedatetimeoffset。然后从 Java 存储OffsetDateTime或只是Instant对象到数据库中并检索相同的类型。 之所以这样称呼OffsetDateTime,是因为它除了日期和时间之外,还包含偏移量。它的方法toLocalDateTime并且toLocalDate保留偏移量,因为它们给出的时间和日期与原始偏移量一致。LocalDateLocalDateTime都不能自己保留偏移量或时区。如果可以的话,避免长期过时的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();

我考虑到字符串包含小写的ampm,Java通常期望大写,通过不敏感地解析该位大小写,并且我检查文本UTC是否存在,但不使用它做任何事情。该代码段生成2018-01-30T17:17-08:00OffsetDateTime,接下来生成LocalDate2018-01-30

相关内容

  • 没有找到相关文章

最新更新