【问题标题】:Convert database time to IST datetime将数据库时间转换为 IST 日期时间
【发布时间】:2017-12-31 06:12:53
【问题描述】:

我有一个时间值以HH:mm:ss 格式存储在我的数据库中(使用MySQL 的time 类型)。该时间将被视为 IST 时区的值。运行我的 Java 代码的服务器遵循 UTC 时区。

如何在 IST(或 UTC 毫秒)中的 yyyy-MM-dd HH:mm:ss 中获取格式化的日期时间?以下是我到目前为止尝试过的:

// ... Code truncated for brevity
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalTime time = resultSet.getTime("send_time").toLocalTime();
LocalDateTime datetime = time.atDate(LocalDate.now());
System.out.println(datetime.format(formatter));

上面正确打印了我的本地机器上的日期时间,它在 IST 上,但我担心它在远程服务器上的行为。

【问题讨论】:

  • 如果可以,请首选LocalTime time = resultSet.getObject("send_time", LocalTime.class);。它需要一个更新的 JDBC 驱动程序(JDBC 版本 4.2),但我相信 MySQL 很早就有这样的 Connector/J,所以你可能会很幸运拥有这个。
  • @OleV.V. - 谢谢你的评论。我正在使用 MyBatis 来获取它,并且我已经为它编写了一个自定义类型处理程序。仅针对这个问题,我已经证明我正在使用 ResultSet 得到它。

标签: java mysql datetime time timezone


【解决方案1】:

由于LocalTimeLocalDateTime 中没有时区信息,因此您的方法很好,无论您计算机的时区如何,都应该有效。一个可能的问题是 LocalDate.now() 以计算机的本地时区而不是 IST 返回今天的日期。您可能希望将其替换为 LocalDate.now(ZoneId.of("Asia/Calcutta"))

或如@OleV.V 所评论。您可以使用新的驱动程序工具直接派生LocalTime

LocalTime time = resultSet.getObject("send_time", LocalTime.class);

注意您的方法可能需要注意的事项:

  • 如果您使用的时区引入了 DST,您最终可能会在数据库中得到两个相同的时间,它们实际上是不同的时刻 - 使用 UTC 来存储时间可能更可靠
  • mysql 中的time 可以存储小于00:00 和大于23:59:59.999999 的值,在这种情况下,您可能会在Java 端遇到意外行为。

【讨论】:

  • 感谢您的回答。主要部分是在印度时区获得LocalDate,现在已解决。在注释中,first 不适用于我,因为时间总是在 IST 中。对于第二个,我想知道更多。能否请您推荐任何在线材料?
  • 我查看了 MySQL 参考手册中的The TIME Type。与 Java API 文档中的 LocalTime 进行比较。如果您确保在 00:00:00 到 23:59:59.999999 之间保存时间,我不敢相信您会看到任何问题。
  • @31piy 另请注意,您可以通过使用TimeZone.setDefault(zone); 更改您的JVM 时区来测试您的代码。理想情况下,您应该在加载 mysql 驱动程序并打开连接之前进行更改,以确保将其考虑在内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多