sqlserver数据库时区问题

在涉及多国用户的项目中,时间统一采用UTC。开发者遇到问题:从bean获取的UTC时间保存到SQL Server数据库时转换成了东八区时间。尝试使用ZonedDateTime和Date进行转换未果,即使减去8小时也引发错误。最终解决方案是在项目启动时设置全局默认时区为UTC,通过修改系统属性实现。
摘要由CSDN通过智能技术生成

项目场景:

项目有美国,印度,中国用户在用因此时间同统一采用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操作直接报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值