Java 日期時(shí)區(qū)

2018-03-12 13:46 更新

Java日期時(shí)區(qū)


ZoneOffset 表示與UTC時(shí)區(qū)偏移的固定區(qū)域。

ZoneOffset不跟蹤由夏令時(shí)導(dǎo)致的區(qū)域偏移的更改。

ZoneOffset類聲明三個(gè)常量:

  • UTC
  • MAX
  • MIN

UTC是UTC的時(shí)區(qū)偏移常量。

MAX和MIN是最大和最小支持的區(qū)域偏移。

Z用作UtC時(shí)區(qū)的區(qū)域偏移指示符。

我們可以用小時(shí),分鐘和秒的組合創(chuàng)建 ZoneOffset

import java.time.ZoneOffset;

public class Main {
  public static void main(String[] args) {
    ZoneOffset zoneOffset1  = ZoneOffset.ofHours(-1);
    System.out.println(zoneOffset1);
    ZoneOffset zoneOffset2  = ZoneOffset.ofHoursMinutes(6, 30);
    System.out.println(zoneOffset2);
    ZoneOffset zoneOffset3  = ZoneOffset.ofHoursMinutesSeconds(9, 30,  45); 
    System.out.println(zoneOffset3);
  }
}

上面的代碼生成以下結(jié)果。


例2

以下代碼顯示如何從偏移創(chuàng)建區(qū)域偏移。

import java.time.ZoneOffset;

public class Main {
  public static void main(String[] args) {
    ZoneOffset zoneOffset1  = ZoneOffset.of("+05:00");
    ZoneOffset zoneOffset2  = ZoneOffset.of("Z"); // Same as ZoneOffset.UTC 
    System.out.println(zoneOffset1);
    System.out.println(zoneOffset2);

  }
}

上面的代碼生成以下結(jié)果。


例3

以下代碼從 ZoneOffset 輸出常量值。

import java.time.ZoneOffset;

public class Main {
  public static void main(String[] args) {
    System.out.println("ZoneOffset.UTC: "    + ZoneOffset.UTC); 
    System.out.println("ZoneOffset.MIN: "    + ZoneOffset.MIN); 
    System.out.println("ZoneOffset.MAX: "    + ZoneOffset.MAX);


  }
}

上面的代碼生成以下結(jié)果。

注意

Java Date-Time API支持以小時(shí),分鐘和秒為單位的區(qū)域偏移量。

來自ZoneOffset的compareTo()允許我們比較兩個(gè)區(qū)域偏移。

+1:30的區(qū)域偏移在+1:00的區(qū)域偏移之前。

Java Date-Time API支持-18:00到+18:00之間的區(qū)域偏移。

ZoneId

ZoneId 表示區(qū)域偏移及其用于更改區(qū)域偏移的規(guī)則夏令時(shí)。

ZoneOffset 表示從UtC時(shí)區(qū)偏移的固定區(qū)域,而 ZoneId 表示可變區(qū)偏移。

這些更改是由時(shí)區(qū)規(guī)則定義的。

時(shí)區(qū)ID

每個(gè)時(shí)區(qū)都有一個(gè)ID,可以用三種格式定義:

  • 在區(qū)域偏移中,可以是“Z”,“+ hh:mm:ss”或“-hh:mm:ss”,例如“+01:00”。
  • 前綴為“UTC”,“GMT”或“UT”,后跟區(qū)域偏移量,例如“UTC + 01:00”。
  • 在區(qū)域名稱中,例如,“美洲/芝加哥”。

以下代碼顯示如何使用of()工廠方法創(chuàng)建ZoneId。

import java.time.ZoneId;

public class Main {
  public static void main(String[] args) {
    ZoneId  usChicago   = ZoneId.of("America/Chicago");
    System.out.println(usChicago);
    ZoneId  fixedZoneId = ZoneId.of("+01:00");
    System.out.println(fixedZoneId);
  }
}

上面的代碼生成以下結(jié)果。

例4

ZoneId 中的 getAvailableZoneIds()返回所有已知時(shí)區(qū)ID。

import java.time.ZoneId;
import java.util.Set;

public class Main {
  public static void main(String[] args) {
    Set<String> zoneIds = ZoneId.getAvailableZoneIds();
    for  (String  zoneId: zoneIds) { 
      System.out.println(zoneId);
    }
  }
}

上面的代碼生成以下結(jié)果。

ZoneRules

ZoneRules 跟蹤區(qū)域偏移如何變化。

下面的代碼顯示了如何使用 ZoneRules 以獲取有關(guān)ZoneId的時(shí)間偏移和時(shí)間更改的信息。

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.zone.ZoneOffsetTransition;
import java.time.zone.ZoneRules;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    LocalDateTime  now = LocalDateTime.now(); 
    ZoneId  usChicago   = ZoneId.of("America/Chicago");
    System.out.println("Zone ID:  "  + usChicago.getId());

    ZoneRules  rules = usChicago.getRules();
    System.out.println("isFixedOffset(): "  + rules.isFixedOffset());
    ZoneOffset offset = rules.getOffset(now); 
    System.out.println("Zone offset: "  + offset);

    List<ZoneOffsetTransition> transitions = rules.getTransitions(); 
    System.out.println(transitions);

  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)