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

环境:JDK1.8.114

web容器:Tomcat 9

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

操作系统ubuntu 16 amd64

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

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

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

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

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

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

  1. cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime

  2. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

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

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

  1.      ZoneId zoneId = ZoneId.of("GMT+8");
  2. ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(), zoneId);
  3. 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更多时区获取方法可以参考以下代码:

  1. String[] ids = TimeZone.getAvailableIDs();
  2. for (String id : ids) {
  3. System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
  4. }
  5.  
  6. private static String displayTimeZone(TimeZone tz) {
  7.  
  8. long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
  9. long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
  10. - TimeUnit.HOURS.toMinutes(hours);
  11. // avoid -4:-30 issue
  12. minutes = Math.abs(minutes);
  13.  
  14. String result = "";
  15. if (hours > 0) {
  16. result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
  17. } else {
  18. result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
  19. }
  20.  
  21. return result;
  22.  
  23. }

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

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

Change time zone for tomcat

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

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

Tomcat设置默认时区的更多相关文章

  1. Tomcat设置默认启动项目及Java Web工程设置默认启动页面

    Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...

  2. tomcat设置默认启动项

     Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下:     1.打开tomcat的安装根目 ...

  3. Tomcat设置默认启动项目

    Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下:     1.打开tomcat的安装根目录,找 ...

  4. MTK Android中设置默认时区

    设置默认时区 PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai\ 注:搜索“persist.sys.timezone ...

  5. (原创)项目部署-Tomcat设置默认访问项目及项目重复加载问题处理

    主要是通过配置<Tomcat安装目录>/conf/server.xml文件 步骤: 1.打开server.xml,在</Host>的上一行添加内容格式如下 <Contex ...

  6. tomcat设置默认欢迎页、server.xml配置文件中的标签理解

    一:要求:输入网址,不加文件名便可以访问默认页面 (1)项目中只有静态文件 方法:更改tomcat下的conf目录下的web.xml文件,如下图: <welcom-file-list>元素 ...

  7. tomcat 设置默认编码格式

    在tomcat目录下 conf文件夹下的server.xml中: <Connector port="80" protocol="HTTP/1.1"     ...

  8. 我的Android进阶之旅------>Android 设置默认语言、默认时区

    1. 设置默认时区 PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai\ 注:搜索“persist.sys.timez ...

  9. 修改PHP的默认时区

    每个地区都有自己的本地时间,在网上及无线电通信中,时间的转换问题显得格外突出.整个地球分为24个时区,每个时区都有自己的本地时间.在国际无线电或网络通信场合,为了统一起见,使用一个统一的时间,成为通用 ...

随机推荐

  1. LayUI——数据表格使用

    Layui数据表格的实际项目使用 Layui的数据表格可谓是在后台管理的页面中经常用到的工具了 最近做项目就用到了,项目的要求是用数据表格显示出后台文章的列表并且每一行的文章都有对应的修改删除操作按钮 ...

  2. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  3. ORM sqlachemy学习

    内容: 1.ORM介绍 2.SQLAlchemy介绍 3.SQLAlchemy内部处理 4.SQLAlchemy使用 参考: http://www.cnblogs.com/wupeiqi/articl ...

  4. MS SQL Server 定时任务实现自动备份

    SQL Server Express 版本是没有SQL 代理服务的,从而导致不能使用SQL Server的定时自动备份功能.真心感觉这就是一个坑,虽然Express是学习的版本,但是精简的也太多了.另 ...

  5. 20165233 2017-2018-2 《Java程序设计》课程总结

    20165233 2017-2018-2 课程总结 每周作业链接汇总 第0周 预备作业1 我期望的师生关系 预备作业2 学习基础和C语言基础调查 预备作业3 Linux安装及学习 第1周 第1周作业 ...

  6. uva146-枚举,排列

    题意: 输入最多150个小写字母,在字典序增大的方向,求下一个排列是什么. 模拟枚举,最后一个字符是递归的最后一层(n层),那么把它弹出栈(还剩n-1层),如果n-1层的字符比第n层小,说明把n层的字 ...

  7. MVC 4 Razor Design Sample Demo Project

    This is a demo project in MCV 4 razor design which encompases the general design of MVC pattern. The ...

  8. 2. java获取下周日-下周六的时间

    String[] arrDate = new String[7]; String[] arrWeek = new String[7]; int mondayPlus = 0; Calendar cd ...

  9. 37. CentOS-6.3安装配置Weblogic-10

    安装说明 安装环境:CentOS-6.3-x64软件:server1001_ccjk_linux32.bin安装方式:bin文件安装 安装位置:/usr/local/weblogic/下载地址:htt ...

  10. DevExpress ImageComboBoxEdit增加

    Combo_订单类型.Properties.Items.Clear() Select Case Combo_客户名称.EditValue Case "ABC" Combo_订单类型 ...