gpt4 book ai didi

java - 将 LocalDateTime 转换为时间戳格式

转载 作者:行者123 更新时间:2023-11-30 01:50:42 25 4
gpt4 key购买 nike

我将日期时间字符串格式从不同的格式转换为时间戳(java.sql)。我已根据不同的格式将其转换为 LocalDateTime 。有没有办法将 LocalDateTime 对象转换为时间戳?

最佳答案

它比你想象的更精致,你问得很好。

由于您可以使用 java.time(现代 Java 日期和时间 API),因此您不应该希望也应用老式且设计不佳的 Timestamp 类。

我假设您要求 Timestamp 是因为您需要可以将某些内容存储到 timestamp 类型(无时区)的 SQL 数据库列中。请允许我提一下,在大多数情况下,您不需要这样的列。标准 SQL 数据类型 timestamp 并不名副其实。虽然时间戳的想法是它应该标识发生某事时的明确时间点,但 SQL timestamp 确实定义这样的时间点。它定义了一天中的日期和时间,任何人都可以在任何时区自由解释它,允许大约 26 小时的变化。相反,对于某个时间点,您应该使用带有时区的时间戳。它也不名副其实,因为它不允许你选择时区。它以 UTC 格式存储时间,因此可以识别唯一的时间点。

在 Java 端,使用 OffsetDateTime 存储到 timestamp with timezone 列中。由于您已经有了 LocalDateTime,因此需要进行转换。为了进行转换,您需要知道 LocalDateTime 后面的时区。例如:

    final ZoneId zone = ZoneId.of("Asia/Tehran");
LocalDateTime ldt = LocalDateTime.of(2019, 2, 25, 23, 45);
OffsetDateTime odt = ldt.atZone(zone).toOffsetDateTime();

System.out.println("As OffsetDateTime: " + odt);

As OffsetDateTime: 2019-02-25T23:45+03:30

存储到您的数据库中:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
"insert into your_table(your_ts_with_timezone) values (?)");
ps.setObject(1, odt);
ps.executeUpdate();

如果由于某种原因您确实需要数据库中没有时区的时间戳或者无法更改它,则根本不需要任何转换。只需存储您拥有的 LocalDateTime 即可:

    PreparedStatement ps = yourDatabaseConnection.prepareStatement(
"insert into your_table(your_ts_without_timezone) values (?)");
ps.setObject(1, ldt);

如果您正在对需要老式 java.sql.Timestamp 对象的遗留 API 进行编程,那么事情会变得更加微妙。 Timestamp 确实定义了一个时间点。因此,您现在需要从未定义时间点的 LocalDateTime 转换为定义时间点的 Timestamp,然后传递 Timestamp code> 到一个 API,该 API 可以将其存储在数据库列中,该列同样没有定义明确的时间点。您需要确定哪些时区用于转换,但仍然可能存在失败或(更糟糕)给出错误结果的极端情况。然而,正如 the_storyteller 在评论中提到的,转换非常简单:

    Timestamp ts = Timestamp.valueOf(ldt);
System.out.println("As old-fashioned Timestamp: " + ts);

As old-fashioned Timestamp: 2019-02-25 23:45:00.0

转换使用您的 JVM 默认时区。 TImestamp.toString() 也使用此设置,因此输出符合预期。不过,这是不稳定的,因为在 JVM 中运行的任何程序都可能随时更改默认时区设置,因此通常您不知道会得到什么。要控制用于转换的时区:

    Instant i = ldt.atZone(zone).toInstant();
Timestamp ts = Timestamp.from(i);

链接

关于java - 将 LocalDateTime 转换为时间戳格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com