zoukankan      html  css  js  c++  java
  • Tomcat设置默认时区

    本文讲解如何在tomcat启动时设置JVM默认时区。

    环境:JDK1.8.114

    web容器:Tomcat 9

    tomcat启动脚本 /etc/init.d/tomcat

    操作系统ubuntu 16 amd64

    作为java开发人员,以下代码应该不会觉有有什么意外,运行正常。

    是的,他的确能正常运行。

         String sql = "insert into `order`(clientid,licensestr,type,amount,`status`,months,info,createtime) values(?,?,?,?,?,?,?,?)";        
            try {
                PreparedStatement pst = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);    
                pst.setLong(1, clientid);
                pst.setString(2, String.format("SN-%s",generateNextSequence()));
                pst.setInt(3, 1);
                pst.setInt(4, 1);
                pst.setString(5, "status/waitforlicense");
                pst.setInt(6, -1);
                pst.setString(7, "");
                SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      
                pst.setString(8, format.format(new Date()));
                int effect = pst.executeUpdate();
                if(effect>0){
                    ResultSet rs = pst.getGeneratedKeys();
                    if(rs.next())
                    {
                        long last_inserted_id = rs.getLong(1);                    
                        return last_inserted_id;
                    }
                }            
            } catch (SQLException e) { 
                e.printStackTrace();
            }

    他会在数据库中插入的createtime是当前JVM的默认本地(Locale)时间。因为特殊需要,笔者曾经在非东八区时间(GMT+8) --北京时间   部署项目。

    录入数据库的时间不是北京时间,当业务数据捞(load)上来的时候一头雾水,也与业务数据时间不一致,产生了很多烦恼。

    有的小伙伴会想到以下命令(不同版本的Ubuntu命令不一样)

    cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime
    或 
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    笔者在本地虚拟机执行以上命令就能得到正确的时间,但是笔者购买的虚拟机环境已经设置了正确的时间,

    Tomcat获取的时间仍旧不对,后来笔者找到了类似(jdk1.8)代码,替换以上的createtime字段,插入的数据也是对的。

         ZoneId zoneId = ZoneId.of("GMT+8");
            ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(), zoneId);
            System.out.println(zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

    以上这段代码来自Stackoverflow:How to get local time of different time zones?

    根据ZoneId.of的api说明,你还可以选择其他更多格式,例如 America/New_York,Z,UTC+01:00,GMT,GMT-2,-4等,具体可以参考ZoneId API

    当前JVM更多时区获取方法可以参考以下代码:

    String[] ids = TimeZone.getAvailableIDs();
    for (String id : ids) {
        System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
    }
    
        private static String displayTimeZone(TimeZone tz) {
    
            long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
            long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                                      - TimeUnit.HOURS.toMinutes(hours);
            // avoid -4:-30 issue
            minutes = Math.abs(minutes);
    
            String result = "";
            if (hours > 0) {
                result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
            } else {
                result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
            }
    
            return result;
    
        }

    有些特殊情况下是不允许修改代码的,如没有编译环境,代码闭源等。

    这个时候我们就要从JVM入手了,一个tomcat进程对应一个JVM,我们可以对这个JVM设置一些启动参数,带着这个疑问我们找到了解决方法

    Change time zone for tomcat

    windows下编辑tomcat/bin/setclasspath.bat
    在所有代码之前添加
    set JAVA_OPTS="-Duser.timezone=GMT" 
    linux编辑tomcat/bin/setclasspath.sh
    在所有代码之前添加
    export JAVA_OPTS="-Duser.timezone=GMT"
    如果设置了随机启动脚本要修改随机启动脚本
    vim /etc/init.d/tomcat
    export JAVA_OPTS="-Duser.timezone=GMT+8:00" 或 export JAVA_OPTS="-Duser.timezone=GMT+8"
    
    

     经过以上设置,不管你的程序放到什么地方,每次获取的时间都是北京时间。

  • 相关阅读:
    第3 章流程控制语句
    第7 章面向对象程序设计
    linux运维常用命令
    第1 章初识Python
    nginx安装与部署
    Linux下软件安装的几种方式
    MAYA 多线程
    Maya pywin32
    python 中调用windows系统api操作剪贴版
    Maya QT interfaces in a class
  • 原文地址:https://www.cnblogs.com/passedbylove/p/7491226.html
Copyright © 2011-2022 走看看