项目中的时区问题概述

项目中发现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}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值