[英]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.