Redhat linux及其Oracle JRE、IBM JRE的時間、時區及夏令時

對於集羣和分佈式等大型系統來講,時間及其同步是個很重要的問題。通過對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。
相關文章
相關標籤/搜索