java8 java.time.ZoneOffset 教程与实例

1,194 阅读3分钟

什么是java8中的ZoneOffset类?

ZoneOffset类定义在java.time 包中,在java8中作为日期时间API增强的一部分引入。

它用于表示offset ,从UTC 时区和Offset返回与UTC时区的小时/分钟差。

时区是地球上的一部分,就像一组或单个国家,它们都遵循标准时间。

每个时区包含两个属性:

  • id - 亚洲/卡尔卡塔
  • offset - 与UTC/Greenwich的时差或偏移 - 例子是+05:30

ZoneOffset的特点

  • 它是不可变的,一旦实例被创建,就不能修改实例的状态。
  • 在多线程环境下,它是线程安全的。
  • 它基于一个基于值的类,当这个类使用===操作符检查重复或相同的实例时,会给出不一致的结果,而且行为是特定于JVM的。

类的特征

public final class ZoneOffset  
        extends ZoneId  
        implements TemporalAccessor, TemporalAdjuster, Comparable, Serializable 

它扩展了ZoneId 类,该类表示时区标识,如欧洲/巴黎。

使用实例

它有of()、ofHours()、ofHoursMinutes()、ofHoursMinutesSeconds()方法来创建ZoneOffset实例。

import java.time.ZoneOffset;
public class Test {
    public static void main(String[] args) {
        ZoneOffset zonedOffsetUtc = ZoneOffset.UTC;
        ZoneOffset zonedOffsetMin = ZoneOffset.MIN;
        ZoneOffset zonedOffsetMax = ZoneOffset.MAX;
        System.out.println(zonedOffsetUtc);
        System.out.println(zonedOffsetMin);
        System.out.println(zonedOffsetMax);
        ZoneOffset zoneOffSet = ZoneOffset.ofHours(5);
        System.out.println(zoneOffSet);
    }
}  

输出

Z  
-18:00  
+18:00  
+05:00  

Z代表一个从UTC出发的时区偏移。

如何在java8中把ZoneId转换为ZoneOffset?

当处理时区转换时,Instance是一个正确的转换实例,因为它可以提供正确的信息。

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Test {
    public static void main(String[] args) {
        Instant instantObject = Instant.now();
        ZoneId systemDefaultZone = ZoneId.systemDefault();
        ZoneOffset myzoneoffset = systemDefaultZone.getRules().getOffset(instantObject);
        System.out.println(myzoneoffset);
    }
}  

如何在java8中把ZoneOffset转换为ZoneId?

java.time.ZoneId类有ofOffset方法,可以从zoneOffset ,并创建ZoneIdprefix

下面是一个语法

public static ZoneId ofOffset(String prefix,   ZoneOffset offset)  

下面的代码是Offset方法的用法

import java.time.ZoneId;
import java.time.ZoneOffset;
public class Test {
    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.ofOffset("GMT",ZoneOffset.UTC);
        System.out.println(zoneId); //GMT 
    }
}   

以下是获得偏移值的步骤:

  • 首先,你需要创建一个LocalDateTime的实例。
  • LocalDateTime将只给出最佳的可用偏移量。
  • 要获得我的本地系统偏移量,你必须使用ZoneId.systemDefault()--这将给出我的系统默认时区(ZoneId.systemDefault()
  • 下一步,是使用当前的偏移量(Instant.now())来获得时区规则,从而获得时区偏移量。
  • 这就给出了与UTC时区差异的小时/分钟偏移数
import java.time.Instant;
import java.time.ZoneId;
public class Test {
    public static void main(String[] args) {
        System.out.println(ZoneId.systemDefault().getRules().getOffset(Instant.now())); // +05:30

    }
}  

ZoneOffset方法

方法说明
adjustInto(Temporal temporal)用参数对象的相同偏移量调整调用者的Offset。
getId()返回偏移量ID,即Z
get(TemporalField field)从一个偏移量返回Int值的字段
getLong()将偏移量中的字段作为一个Long值返回
of(String offsetId)它用于创建一个有ID的ZoneOffset对象。
ofHours(int hours)用于创建一个带有偏移小时的ZoneOffset对象。
ofHoursMinutes(int offsetHours, int offsetMinutes)它用于创建一个带有偏移小时和分钟的ZoneOffset对象。
ofHoursMinutesSeconds(int hours, int minutes, int seconds)它用于创建一个带有偏移小时、分钟和秒的ZoneOffset对象。
ofTotalSeconds(int totalSeconds)它用于创建一个具有总秒数的ZoneOffset对象。
range(TemporalField field)它用于使用Temporal字段的值的范围。

总结

通过以下例子学习ZoneOffset类教程

  • 如何在java8中把ZoneOffset转换为ZoneId?
  • 如何从UTC时区获取偏移值?
  • 如何在java8中把ZoneId转换为ZoneOffset?
  • 方法