介紹這篇文章之前,首先回答一個問題,以前都沒有時區的概念,程序也寫的好好的,為什么要計算時區哪?舉個例子,比如有一個訂單的時間是: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方法可以調整顯示的時區
