项目中发现new Date()时在 本地(Windows)启动时正常,但在Linux服务器上少一天。
注:因数据库中存储的时间为字符串,所以此处不考虑数据库带来的时区问题。
重点是在宿主机及Docker容器调整后,问题依旧存在,故而在代码级别进行处理:
(1)在项目启动类中设置:
/**
* 启动时设置该项目时区
*
* @return
*/
@PostConstruct
public void setDefaultTimezone() {
// long time = System.currentTimeMillis();
// String millis = Long.toString(time);
// Date date = new Date(time);
// log.info("Current time in milliseconds = " + millis + " => " + date.toString());
// log.info("Current time zone: " + TimeZone.getDefault().getID());
// TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
1、被@PostConstruct修饰后,会在服务器加载Servlet时运行( 在构造函数后,init()方法前 ),
并且只会被服务器调用一次。
2、此段代码是在系统的缓存中设置时区,作用域是此时运行的整个程序,但并不会影响JVM中
的user.timezone属性,即系统属性;所以当TimeZone.setDefault()设置为null或者不设置时,
会默认读取系统属性。
3、TimeZone.setDefault()只在当前线程和之后创建的子线程有效。
(2)设置日志( 如Logback )时区:UTC+8/GMT+8(Asia/Shanghai)
%d{yyyy-MM-dd HH:mm:ss.SSS,Asia/Shanghai}