jvm linux 时区设置
# 背景
在接入集团一个平台的时候,发现录制某个接口到测试环境回放,发现接口入参一致,一个start_day 一个end_day,但回放的时候会多调用一次数据库查询,很是奇怪;
查阅业务代码,发现确实有逻辑会导致多查询一次,于是重点观察数据变化,发现录制回放两个时间不一致,相差12个小时;
继续查阅业务日志,发现在第一次查询DB的时候,两次的时间不一样,就是说接口入参(String类型)一致,通过应用转化为int类型的时候就出问题了的,相差12个小时;
因此猜测是时区问题!!!
# 思路&解决
1. 既然发现是时区问题,比较好搞咯,去到录制机器A和回放机器B,通过linux命令查看时区
date -R
发现都是Fri, 06 Jul 2018 12:11:22 +0800
都是+8,东八区
date +"%Z %z"
结果发现还是一致呀,都是CST +0800
2. 不对,时区一样呀,那么问题就是java执行不一样? 核对了jdk版本,发现一致
3. 那么就在两台机器上执行java代码试下:
System.out.println(TimeZone.getDefault()); //输出当前默认时区
发现了问题了,两台机器打印的不一致,A是上海,而B是纽约。。。
4. 那么问题变成了jvm从哪里去获取时区的呢?经过查询大致如下:
1)如有环境变量 TZ设置,则用TZ中设置的时区
2) 在 /etc/sysconfig/clock文件中找 "ZONE"的值
3)如2)都没,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。
简单来说就是:
TZ环境变量 --> /etc/sysconfig/clock文件 --> /etc/localtime文件 依次寻找
5. 于是开始设置了,TZ不管了,加了/etc/sysconfig/clock,如下操作:
新建一个/etc/sysconfig/clock,内容如下:
ZONE="Asia/Shanghai" UTC=false ARC=false
然后继续去查看时区,还是不对呀!!
6. 继续设置/etc/localtime文件,如下操作:
unlink /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
就是初始化/etc/localtime ,然后将东八区的绑定上
7. 在查看时区成功了,重新执行java代码,发现正常了
8. 继续翻阅资料,发现:
时区的配置文件是/etc/sysconfig/clock。用tzselect命令就可以修改这个配置文件,根据命令的提示进行修改就好了。
但是在实际工作中,发现这种方式是不能够使得服务器上的时间设置马上生效的,而且使用ntpdate去同步时间服务器也不能够更改时间。即使你使用了 date命令手工设置了时间的话,如果使用ntpdate去进行时间同步的话,时间又会被改动到原来的错误时区的时间。而生产的机器往往是非常重要的,不能够进行重启等操作。
1)/etc/sysconfig/clock 文件,只对 hwclock
命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc,
或 --localtime) 都没有变化,要重启系统后才生效);
在 /etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok --localtime 输出的时间应该都一致,且此时 hwclock --utc是没有意义的;
在 /etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock --localtime 的输出则是UTC时间;
系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 /etc/sysconfig/clock 文件中UTC的参数来设置时区转换。
意思就是修改/etc/sysconfi/clock是可行的,但是不会立即生效,需要重启。那么一切就说的通了
# 后记
参考资料:
https://www.nowcoder.com/questionTerminal/1e794493ad564324a16da1c47545c117
http://blog.51cto.com/5iwww/661863
https://my.oschina.net/huawu/blog/4646
http://linux.it.net.cn/CentOS/fast/2016/0511/21660.html
https://blog.csdn.net/splenday/article/details/47065557
https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
虽千万人,吾往矣!低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
排名前10的vue前端UI框架框架值得你掌握
之前得到消息vue在GitHub已经超过react,成为第一大框架,让我们来看看以vue为基础的开发框架有哪些? Element(start-28128) 饿了么前端推出的基于 Vue.js 2.0 的后台组件库,它能够帮助你更轻松更快速地开发 web 项目 官网地址 element.eleme.io/ iview(start-15674) iview一套基于 Vue.js 的高质量 UI 组件库,友好的 API ,自由灵活地使用空间,细致、漂亮的 UI。由TalkingData开发维护,有很多知名互联网企业都在使用 官网地址 iviewui.com/ vuetify(start-11449) 一个为 Vue JS 2.0 打造的 Material 风格的组件库,喜欢material design的朋友可以去尝试一下 官网地址vuetifyjs.com/ vue-strap(start-4752) 基于 Vue.js 的 Bootstrap 组件 该仓库包含一系列基于 Bootstrap 标记和 CSS 的本地 Vue.js 组件。所以不需要 jQuery 和 Bootstrap 的 ...
- 下一篇
【JSConf EU 2018】WebAssembly 的手工艺术
在今年欧洲的JSConf上Emil Bay进行了一场题为《Hand-Crafting WebAssembly》的演讲。Emil表示:“现在已经有很多关于WebAssembly(WASM)的演讲。遗憾的是,大多数演讲是关于如何把高级语言编译成wasm的,他们把wasm当成一个半透明的盒子。WebAssembly是一门有趣的语言,你可以用它写出性能低于C的代码”。在这此的演讲中,Emil向我们演示了如何写WAT(WebAssembly的文本格式)以及当拥有大内存时,如何推理算法,如何将高级结构(如循环)转换为基础指令,同时获得乐趣!Emil演示了如何把一些难度逐渐递增的算法转换成基础指令,在没有抽象的情况下每一个算法的实现都充满着挑战。即时你在工作中并没有使用WASM,学习计算机的最低级指令可以拨开抽象的迷雾,揭示计算机的神奇。在开始正文之前让我们先一睹大佬风采 什么是WebAssembly “WebAssembly(缩写Wasm)是运行在一个基于栈的虚拟机上的二进制指令格式。Wasm是为了把像C/C++/Rust等高级语言编译成便携式的目标而设计的,可以被部署到Web端和服务端应用”。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音