繁体   English   中英

将SQL UTC时间戳转换为本地时区Java

[英]Converting SQL UTC timestamp to local timezone Java

我有以下代码。 我已经在我的SQL数据库中存储了一个utc时间,并且当我从数据库中提取它时想将其转换为本地时间。

        Instant startInstant = rs.getTimestamp(5).toInstant();
        Instant endInstant = rs.getTimestamp(6).toInstant();
        ZoneId z = ZoneId.of(TimeZone.getDefault().getID());

        ZonedDateTime start = startInstant.atZone(z);
        ZonedDateTime end = startInstant.atZone(z);


        System.out.println(start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV")));
        System.out.println(end.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV")));

这是我得到的输出:

2017-11-01 01:40:00 America/Chicago
2017-11-01 01:40:00 America/Chicago

日期和时间与我的数据库中的相同:这是表中的字段值:

2017-11-01 01:40:00

似乎已更新的唯一内容只是America / Chicago的zoneID,对于我需要的功能在功能上毫无用处。

关于我哪里出了问题的任何指示?

您没有提供足够的信息来给出确切的答案。 您没有确切说明日期时间值周围的列的数据类型。 我怀疑您没有使用与TIMESTAMP WITH TIME ZONE的SQL标准类型等效的MySQL。

我也想知道为什么您的存储值示例缺少从UTC到时区的偏移量。 那是可疑的。

最后,您可能会通过使用具有默认时区的交互式SQL会话来查找存储的值,该会话将在显示在会话中之前动态应用于从数据库中检索到的值。 尽管出于很好的意图,但我认为这是一种反功能,因为它掩盖了存储数据的真实性质。 此行为可能解释您的困惑。 尝试将会话的默认时区明确设置为UTC。

您代码的其他问题…

完全跳过对java.sql.Timestamp的使用。 如果JDBC驱动程序支持JDBC 4.2或更高版本,则可以直接使用java.time类型。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

不要将TimeZone类的旧式旧类与现代的java.time类混合使用。 遗留类完全被java.time取代; 甩掉包袱。

ZoneId z = ZoneId.systemDefault() ;

您将获得与在数据库中输入的相同的值。 您在数据库中有时间戳记值,但是如何说存储的值是以UTC表示的(这些值可能是UTC而不是UTC格式,所以通过查看该值,您不能说该值是UTC的->'2017-11-01 01:40:00')。

如果要在其他时区获取值,也可以这样:

例如:SET time_zone ='+ 03:00'; 从表中选择值;

它将为您提供指定时区的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM