JavaWeb 项目与系统时间相差 8 个小时的问题

Wesley13
• 阅读 678

@TOC

写在前面

今天记录分享一个排查部署到 Linux 上的 web 项目执行的时间和本地系统时间相差 8 小时的问题

环境:redhat 6.5 考虑有规律的时间差可能和时区不同有关

1 查看 Linux 系统时间和时区

[root@localhost ~]# date
2019年 03月 31日 星期日 16:00:32 CST
[root@localhost ~]# date -R
Sun, 31 Mar 2019 16:00:44 +0800
[root@localhost ~]# date +"%Z %z"
CST +0800

从这里可以确定,系统的时间和时区正常(北京时间,也就是东八区),时区详情请看这里

2 查看 jvm 时间和时区

2.1 先在 Linux 上某个目录执行 javac ,看 javac 命令是否可用,出现如下显示就可以(中间部分已省略)

[root@localhost test]# javac
用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  ......
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名

2.2 编写测试程序

import java.util.TimeZone;
import java.util.Date;

public class time {
    public static void main(String[] args) {
        System.out.println("当前时间:"+new Date());
        System.out.println("当前默认时区:"+TimeZone.getDefault());
    }
}

2.3 编译执行

[root@localhost test]# javac time.java 
[root@localhost test]# ll
总用量 8
-rw-r--r-- 1 root root 780 3月  31 16:02 time.class
-rw-r--r-- 1 root root 239 3月  31 16:00 time.java
[root@localhost test]# java time
当前时间:Sun Mar 31 08:02:34 CTM 2019
当前默认时区:sun.util.calendar.ZoneInfo[id="GTM",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]

这里有导其他的包,如果以上命令不好使,则使用如下命令 (中间的点 . 是当前目录的意思)

[root@localhost test]# javac -d . time.java
[root@localhost test]# ll
总用量 8
-rw-r--r-- 1 root root 780 3月  31 16:03 time.class
-rw-r--r-- 1 root root 239 3月  31 11:00 time.java
[root@localhost test]# java -cp . time
当前时间:Sun Mar 31 08:02:40 CST 2019
当前默认时区:sun.util.calendar.ZoneInfo[id="GTM",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]

这里显然 jvm 的时间比系统的时间早了 8 个小时,且是格林威治的时区,所以这里修改 jvm 的时区即可,这里说下,网上查询说 jvm 的时区默认读取的是硬件时区,目录为 /etc/sysconfig/clock (详情),查看如下

[root@localhost test]# cat /etc/sysconfig/clock 
ZONE="Asia/Shanghai"

与网上对比,这里没有下面这两行

UTC=false
ARC=false

这里看有人说是没有设置 UTC=false 导致的问题,查看资料说 UTC 指定 BIOS 中保存的时间是否是 GMT/UTC 时间,true 表示 BIOS 里面保存的时间是 UTC 时间,false 表示 BIOS 里面保存的时间是本地时间。 加上后有的机器还是不好使,如果是在 tomcat 下运行的项目,那就重启 tomcat 即可。

如果还不好使,还有修改 tomcat 配置文件的方法,欢迎参考之前的文章:Tomcat修改日期的时区

现在问题基本已解决,以上有些内容是客户现场出现的,所以现在记录时也是凭笔记和记忆回忆的,如有偏差也请不吝赐教。

文章参考:https://blog.csdn.net/liqinghuiyx/article/details/53333284

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0