项目场景:

项目有美国,印度,中国用户在用因此时间同统一采用utc时间相当于零时区,前端进行转换。

问题描述:

本地在开发测试时系统bean中取得0时区时间后保存到数据库时变为东八区时间,取东八区时间保存到数据库也是东八区时间,数据库时区为(UTC) Coordinated Universal Time,jdbc连接未设置时区,猜想到是这个原因导致的,但 SQLServerDataSource中没有相应时区参数因此无法在jdbc中追加。

 SQLServerDataSource dataSource = new SQLServerDataSource();

            Class.forName(driverClassName).newInstance();
            dataSource.setServerName(serverName);
            dataSource.setDatabaseName(databaseName);
            dataSource.setSSLProtocol(sslProtocol);
            dataSource.setEncrypt(encrypt);
            dataSource.setTrustServerCertificate(trustServerCertificate);
            dataSource.setHostNameInCertificate(hostNameInCertificate);
            dataSource.setAuthentication(authentication);
            dataSource.setUser(user);
            dataSource.setPassword(password);
            dataSource.setPortNumber(port);
              return dataSource;

解决方案:

于是只能换一种方式后解决:在项目初始化时设置当前进程的默认时区

@Configuration
public class UTCTimeZoneConfiguration implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.setProperty("user.timezone", "UTC");
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
    @Override
    public void contextDestroyed(ServletContextEvent event) {}
}

再说下中间排错遇到的问题
一开始以为是jpa不支持Instant 导致于是将获得时间的 Instant.now()换成
ZonedDateTime now = ZonedDateTime.now(ZoneId.of(“Europe/London”));
但是问题依然存在。
更离谱的是我用Date取时间,然后减去八个小时
Date modifiedDate = new Date();
modifiedDate=DateUtil.offsetHour(modifiedDate,-8);
进行update操作直接报错。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐