加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_镇江站长网 (https://www.0511zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Redhat linux及其Oracle JRE、IBM JRE的时间、时区及夏令时 - Linux系统

发布时间:2014-03-24 09:31:33 所属栏目:Linux 来源:站长网
导读:对于集群和分布式等大型系统来说,时间及其同步是个很重要的问题。经过对redhat linux及JRE(包括oracle JRE,IBM JRE)的研究,现总结如下。 1,时间的查看 通
对于集群和分布式等大型系统来说,时间及其同步是个很重要的问题。经过对redhat linux及JRE(包括oracle JRE,IBM JRE)的研究,现总结如下。

1,时间的查看

通常的时间可分为local时间和UTC时间,local时间在linux下使用date查看:

# date

Wed Oct 31 17:38:06 BRST 2012

通常这个时间是指所在时区和包括了夏令时计算的时间值。所有使用linux时间的系统打印出的时间都是这个。

UTC时间是指标准格林威治及零时区的时间,不包含夏令时的计算。UTC时间查看方式是:

# date -u

Wed Oct 31 19:38:12 UTC 2012

基本上:Local时间=UTC时间+时区时间差+夏令时时间差

还有硬件时间,及BIOS上存储的时间,查看方式:

# hwclock

Wed 31 Oct 2012 05:38:16 PM BRST  -0.328544 seconds

为了查看JRE的时间,我们写了一个工具:

# cat TestTimeZone.java

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class TestTimeZone
{
                private static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS (z)";
                private static SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_FORMAT);
                public static void main(String args[])
                {
                                Date dt = new Date();
                                System.out.println("Current time:t"+ sdf.format(dt));
                                sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
                                System.out.println("UTC time:t"+ sdf.format(dt));
                                System.out.println("Env variable user.timezone:" + System.getProperty(""user.timezone"));
                }
}

为了兼容低版本JRE,采用JDK1.4编译,运行:

#/usr/java/j2sdk1.4.2/bin/java TestTimeZone.java

#java TestTimeZone

Current time:   2012-10-31 15:57:47.014 (BRST)

UTC time:       2012-10-31 17:57:47.014 (UTC)

Env variable user.timezone   :America/Bahia

2,Linux时间及JRE的时间关系

先解释下相关配置文件:

/etc/localtime: linux 系统的时区文件,定义linux的时区和夏令时规则

/etc/sysconfig/clock: linux和JRE度要用到的文件,可能没有这个文件,文件内容如:

cat /etc/sysconfig/clock

# The ZONE parameter is only evaluated by system-config-date.

# The timezone of the system is defined by the contents of /etc/localtime.

ZONE="Asia/Shanghai"

UTC=true

ARC=false

ZONE是指时区,对JRE会起作用,对linux会被/etc/localtime中的定义覆盖

UTC是指硬件存储的是否为UTC时间,若为true,则硬件时间当做UTC时间,linux系统启动时会将此事件加上时区和夏令时的差额计算出local时间;若为false则硬件中的时间就是local时间,时区和夏令时规则失效。

当linux系统启动时,首先读取硬件时间,然后根据以上配置文件中的定义计算出时间。

但JRE的时间是独立处理的,JRE自己如linux样独立取得硬件时间,然后根据JRE的时区和夏令时规则计算出JRE的时间。JRE的时区确定规则为:首先确定是否有TZ系统变量(亦为user.timezone, 在启动java程序时亦可通过参数-Duser.timezone单独指定),若有则取TZ变量中的值,若无则取/etc/sysconfig/clock 中的ZONE值。

由上可知,更新时区和夏令时规则时需要同时更新linux和JRE的相关配置和规则的。Linux的夏令时规则在/usr/share/zoneinfo/下;Oracle JRE夏令时规则在:$JAVA_HOME/lib/zi;IBM JRE夏令时规则在$IBM_JAVA_HOME/lib/core.jar。

本文出自 “小何贝贝的技术空间” 博客,请务必保留此出处http://babyhe.blog.51cto.com/1104064/1045570

(编辑:应用网_镇江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!