阅读(155) (0)

Java 日期时区

2017-01-09 19:31:06 更新

Java日期时区


ZoneOffset 表示与UTC时区偏移的固定区域。

ZoneOffset不跟踪由夏令时导致的区域偏移的更改。

ZoneOffset类声明三个常量:

  • UTC
  • MAX
  • MIN

UTC是UTC的时区偏移常量。

MAX和MIN是最大和最小支持的区域偏移。

Z用作UtC时区的区域偏移指示符。

我们可以用小时,分钟和秒的组合创建 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);
  }
}

上面的代码生成以下结果。


例2

以下代码显示如何从偏移创建区域偏移。

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);

  }
}

上面的代码生成以下结果。


例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);


  }
}

上面的代码生成以下结果。

注意

Java Date-Time API支持以小时,分钟和秒为单位的区域偏移量。

来自ZoneOffset的compareTo()允许我们比较两个区域偏移。

+1:30的区域偏移在+1:00的区域偏移之前。

Java Date-Time API支持-18:00到+18:00之间的区域偏移。

ZoneId

ZoneId 表示区域偏移及其用于更改区域偏移的规则夏令时。

ZoneOffset 表示从UtC时区偏移的固定区域,而 ZoneId 表示可变区偏移。

这些更改是由时区规则定义的。

时区ID

每个时区都有一个ID,可以用三种格式定义:

  • 在区域偏移中,可以是“Z”,“+ hh:mm:ss”或“-hh:mm:ss”,例如“+01:00”。
  • 前缀为“UTC”,“GMT”或“UT”,后跟区域偏移量,例如“UTC + 01:00”。
  • 在区域名称中,例如,“美洲/芝加哥”。

以下代码显示如何使用of()工厂方法创建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);
  }
}

上面的代码生成以下结果。

例4

ZoneId 中的 getAvailableZoneIds()返回所有已知时区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);
    }
  }
}

上面的代码生成以下结果。

ZoneRules

ZoneRules 跟踪区域偏移如何变化。

下面的代码显示了如何使用 ZoneRules 以获取有关ZoneId的时间偏移和时间更改的信息。

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);

  }
}

上面的代码生成以下结果。