1. 程式人生 > >java時區講解

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