java&postgresql時區總結


介紹這篇文章之前,首先回答一個問題,以前都沒有時區的概念,程序也寫的好好的,為什么要計算時區哪?舉個例子,比如有一個訂單的時間是:2015-07-04 11:28:19,那么咋一看沒什么問題,可是如果這個訂單的時間讓美國的人看,就沒有意義了,因為他們不知道對應美國的時間到底是幾點,可能是上午,也可能是下午,所以還需要標注上這是哪個時區的時間,比如:(2015-07-04 11:28:19+08),這個+08就是表明這是東八區的時間,那么無論哪個時區的人看見,對應到自己的時間就ok了。

1、基本概念

1.1 時區 :time zone 1884年國際經線會議規定,全球按經度分為24個時區,每區各占經度15°。

以本初子午線為中央經線的時區為零時區,由零時區向東、西各分12區,東、西12區都是半時區,共同使用180°經線的地方時。

1.2 CST :China Standard Time UTC+8:00 中國標准時間(北京時間),在東八區

1.3 UTC :Universal Time Coordinated,世界協調時間,又稱世界標准時間、世界統一時間。UTC 提供了一種與時區無關(或非特定於時區)的時間。

世界上的所有時區都可以表示為 UTC 加上或減去一個偏移量。因此,UTC是0時區的時間,如北京為早上八點(東八區),UTC時間就為零點,時間比北京時晚八小時

1.4 GMT :Greenwich Mean Time格林威治標准時間,指位於英國倫敦郊區的皇家格林尼治天文台的標准時間,因為本初子午線被定義在通過那里的經線。

1.5 Unix timestamp :Unix時間戳,或稱Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方式,定義為從格林威治時間(UTC/GMT的午夜)1970年01月01日00時00分00秒起至現在的總秒數。

1.6 結論

UTC和GMT幾乎是同一概念,兩者的區別是GMT是一個天文上的概念,UTC是基於原子鍾。

GMT=UTC

GMT + 8 = UTC + 8 = CST(北京時間)

UTC+時間差=本地時間 (時間差東為正,西為負,東八區記為 +0800)

2、Date

java的TimeZone對象給我們的是原始的偏移量,也就是與GMT相差的微秒數,Java的Date對象里面存儲着當前時刻到1970年1月1日0:00所經過的毫秒數,它與時區和地域沒有關系(其實可以認為是GMT時間)。計算機內部記錄的時間(Date date = new Date()),為格林威治標准時(GMT)。即java.util.Date代表一個時間點,其值為距公元1970年1月1日 00:00:00的毫秒數,所以它可以認為是沒有時區和Locale概念的。

3、DateFormat(Locale與TimeZone的關系)

3.1 DateFormat:日期格式化類DateFormat, 對於不同地區的配置一般有兩個點, 一個是Locale , 一個是TimeZone

3.2 locale: Locale使DateFormat按所配置的地區特性來輸出文字(例如中國,美國,法國不同地區對日期的表示格式不一樣,中國可能是2001年10月5日)

3.3 TimeZone:讓DateFormat知道怎么去轉換,去調整時間偏移度,從而得到符合配置的時區的時間。

假設當前時區為GMT+0,取得當前時間為2:00,那么如果你配置DateFormat.setTimeZome("GMT+8"),即北京時間的時區,那么這時候格式化輸出的就是10:00了(下面有代碼事例), 因為系統對原始毫秒數進行了時間偏移調整(調到你設置的時區),即加多8小時,之后再格式化輸出日期的字符串形式

4、代碼事例

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.Date;

public class Test {

    public static void main(String[] args) {

        //TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        //TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris")); //注意這行下面的代碼要取消注釋
        TimeZone time = TimeZone.getDefault();// 這個是國際化所用的
        System.out.println(time);
        Calendar calendar = Calendar.getInstance();// 獲取實例
        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 構造格式化模板
        Date date = calendar.getTime(); // 獲取Date對象
        String str = new String();
        str = format1.format(date);// 對象進行格式化,獲取字符串格式的輸出
        System.out.println(str);
    }

}

輸出的結果是:

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
2015-07-03 22:27:14

如果將注釋Europe/Paris這行打開,那么運行的結果是:

sun.util.calendar.ZoneInfo[id="Europe/Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
2015-07-03 16:30:49

說明使用TimeZone.setDefault方法可以調整顯示的時區

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM