sqlserver数据库时区问题
项目场景:项目有美国,印度,中国用户在用因此时间同统一采用utc时间相当于零时区,前端进行转换。问题描述:本地在开发测试时系统bean中取得0时区时间后保存到数据库时变为东八区时间,取东八区时间保存到数据库也是东八区时间,数据库时区为(UTC) Coordinated Universal Time,jdbc连接未设置时区,猜想到是这个原因导致的,但 SQLServerDataSource中没有相应
·
项目场景:
项目有美国,印度,中国用户在用因此时间同统一采用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操作直接报错。
更多推荐
所有评论(0)