java時區理解

1、時區的基本概念
GMT(Greenwich Mean Time),即格林威治標準時,是東西經零度的地方。人們將地球人爲的分爲24等份,每一等份爲一個時區,每時區橫跨經度15度,時間正好爲1小時。往西一個時區,則減去一小時;往東一個時區,則加上一小時。中國在東經120度上,(東經120°-東經0°)所得度數再除以15,即得8。
UTC(Coordinated Universal Time),即世界協調時間,是通過平均太陽時(以格林威治時間GMT爲準)、地軸運動修正後的新時標以及以「秒」爲單位的國際原子時所綜合精算而成的時間,計算過程至關嚴謹精密,所以若以「世界標準時間」的角度來講,UTC比GMT來得更加精準。UTC的本質強調的是比GMT更爲精確的世界時間標準,不過對於現行錶款來講,GMT與UTC的功能與精確度是沒有差異的。
CST時間卻同時能夠表明以下 4 個不一樣的時區:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
可見,CST能夠同時表示美國,澳大利亞,中國,古巴四個國家的標準時間。
DST(Daylight Saving Time),夏日節約時間,指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提前日光的使用,在英國則稱爲夏令時間(Summer Time)。
PDT以及PST, PDT 是 Pacific Daylight Time 的縮寫,美國夏季始於每一年4月的第1個週日,止於每一年10月的最後一個週日。夏令時比正常時間早一小時,與PDT時間相對應的是PST , Pacific Standard Time 。 夏時制結束後就是PST(太平洋標準時間),西八區,與北京時間(東八區)時差-16個小時。java

2、java中的時區
能夠用如下code,列出java中的時區code

String ids[] = TimeZone.getAvailableIDs();
        for(String id: ids) {
            System.out.println(id);
        }

注意:你會發如今PDT不在該時區列表裏
若是要用PDT,用PST做爲時區能夠獲得準確的時間,即便是夏令時orm

TimeZone timeZone = TimeZone.getTimeZone("PST");
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);
        calendar.set(2018, 5, 10);// 輸出 Sun Jun 10 15:00:00 CST 2018
                //calendar.set(2018, 2, 10); // 輸出 Sat Mar 10 16:00:00 CST 2018
        calendar.setTimeZone(timeZone);
        System.out.println(calendar.getTime());

若是要得到某個時區是否使用了DST,能夠用useDaylightTimeci

boolean isUsingDST = TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime();
        System.out.println(isUsingDST);

若是要判斷某個時間在某個時區是否發生了DST,能夠用get

Calendar calendarServer=Calendar.getInstance();
        calendarServer.add(Calendar.DATE, 1);
        boolean isUsingDST = clientTimeZone.inDaylightTime(calendarServer.getTime());
        System.out.println(isUsingDST);

獲取當前時區和UTC的偏移量,在當前時間5月13日(發生了DLS)比較getRawOffset() 和getOffset()io

TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));//將timezone設定到發生夏令時的地區
                int rowOffSet = TimeZone.getDefault().getRawOffset();
        int offSet = TimeZone.getDefault().getOffset(System.currentTimeMillis());
                System.out.println(offSet + " " + offSet/3600000 ); // -7 hours
        System.out.println(rowOffSet + " " + rowOffSet/3600000); // -8 hours

如下是時區轉化的例子form

Date date = new Date(1359641834000L);// 2013-1-31 22:17:14
        String dateStr = "2013-3-31 22:17:14";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("CST"));// CST = GMT - 6(Central Standard Time (USA)而不是北京標準時間)

        try {
//            指該字串以CST來換算,因此實際時間是2013-1-31 22:17:14 CST(GMT - 6),輸出是以host的時區(GMT+8)進行format,因此加14
            Date dateTmp = dateFormat.parse(dateStr);

                        boolean isUsingDST = TimeZone.getTimeZone("CST").inDaylightTime(dateTmp);
            System.out.println(isUsingDST);// 輸出true,所以減1個小時
            System.out.println(dateTmp);//輸出 Fri Feb 01 11:17:14 CST 2013
        } catch(ParseException e) {
            e.printStackTrace();
        }
        String dateStrTmp = dateFormat.format(date);//數字是絕對時間,若是以host時區(GMT+8)來format就是22:17,這個數字以CST/GMT-6時區來format,就是-14
        System.out.println(dateStrTmp);// 輸出 2013-01-31 08:17:14
相關文章
相關標籤/搜索