java時區講解
資源
時區簡介
什麼是時區
時區是人為劃定的,以本初子午線中心(英國格林尼治天文臺),將地球劃為24個時區。時區向東加一區,時間調快一小時,時區向西加一區,時間調慢一小時。如北京為東八區,日本為東九區,北京時間比日本晚一小時。
時區分類
時區有0時區、東1-12區,西1-12區共24區,(這明明是25個區,莫非當年劃分時區的英國人數學太差算錯了?)。當然不是,實際上,東12區和西12區劃為一個區,稱東西12區,東12區佔其中一半,西12區佔其中一半,從東12區進入西12區,時間調慢1天。
時區的表達
GMT
GMT是即格林尼治平太陽時間,實際就是零時區的時間。用”GMT+偏移量”來表示時區。如“GMT+1”代表東一區,時間就是零時區時間加1小時;”GMT-1”就是西1區,時間就是零時區時間減1小時;我國位於東八區,就是”GMT+8”。
UTC
UTC是標準時間,也就是零時區的時間。
Java中的時區處理
JAVA關於時間的儲存
Java存的是從1997/1/1 00:00:00到現在時間的毫秒數,按的是標準時間儲存。如setDate(0)就是1997/1/1 00:00:00。但是獲取時會加上時間的偏移量,我們是東八區,所以setDate(0)的顯示是1997/1/1 08:00:00。
時區之間的轉化處理
由於java中存的是標準時區的時間,只是獲取時轉成本地時區,所以我們只要對時間設定時區,就能獲得對應時區的時間。
Java中的時區類:TimeZone
TimeZone是Java中處理時區的類。
獲得本地時區
Calendar cal = Calendar.getInstance(); TimeZone timeZone = cal.getTimeZone(); System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getDefault();
System.out.println(timeZone1.getID());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
TimeZone timeZone2 = simpleDateFormat.getTimeZone();
System.out.println(timeZone2.getID());
列印
Asia/Shanghai
Asia/Shanghai
Asia/Shanghai
注意java和php時區中沒有asia/beijing,只有asia/shanghai和asia/chongqing,這是民國時期劃分的時區。曾經有程式設計師向sun提出這個問題,但sun不予採納,認為不是bug。對此我認為應該新增asia/beijing,畢竟新中國以北京時間為標準時間,以示對中國的尊重。畢竟中國是個大國。
設定指定時區
TimeZone timeZone = TimeZone.getTimeZone("GMT+2");
System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Shanghai");
System.out.println(timeZone1.getID());
列印
GMT+02:00
Asia/Shanghai
給時間設定時區
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
cal.setTime(new Date());
System.out.println((cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));
System.out.println(simpleDateFormat.format(new Date()));
System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+2")))
列印
8-29 5:36
2017-08-29 05:36:35
2017-08-29 05:36:35
獲得時區偏移量
Calendar cal = Calendar.getInstance();
long offset = cal.get(Calendar.ZONE_OFFSET);
System.out.println(offset/60/60/1000);
TimeZone timeZone = TimeZone.getDefault();
long offset1 = timeZone.getOffset(Calendar.ZONE_OFFSET);
System.out.println(offset1/60/60/1000);
列印
8
8