【问题标题】:Converting SQL UTC timestamp to local timezone Java将 SQL UTC 时间戳转换为本地时区 Java
【发布时间】:2018-04-17 12:03:41
【问题描述】:

我有以下代码。我在 mySQL 数据库中存储了一个 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

似乎唯一更新的只是美国/芝加哥的 zoneID,它在功能上对我需要的东西毫无用处。

任何关于我哪里出错的指针?

【问题讨论】:

    标签: java sql datetime


    【解决方案1】:

    您没有提供足够的信息来给出准确的答案。您没有准确地解释日期时间值周围的列的数据类型。我怀疑您没有使用与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() ;
    

    【讨论】:

      【解决方案2】:

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

      如果你想获取不同时区的值,你也可以这样做:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-09
        • 2011-02-06
        • 2019-08-15
        • 2013-09-12
        • 2012-09-11
        • 2013-06-30
        • 2019-01-05
        • 2013-03-23
        • 1970-01-01
        相关资源
        最近更新 更多