一、介紹ZoneOffset
在Java8中,Zoned日期時間API提供了處理各種時區的API。當我們需要處理時區信息時,可以使用ZoneOffset類來處理。它表示當前時間與UTC時區的偏移量,即當前所處時區與UTC的差值。它是一個枚舉類,包含了所有的時區偏移量。
public enum ZoneOffset implements TemporalAccessor, TemporalAdjuster, Comparable, Serializable {
//省略屬性和方法
UTC("+00:00"), GMT("+00:00"), //標準時區
//其它時區
}
可以看到,ZoneOffset提供了靜態常量UTC和GMT表示標準時區,其它時區由其它常量表示。同時,它也實現了TemporalAccessor和TemporalAdjuster接口,可以使用這些接口提供的方法對時間進行操作。
二、構造ZoneOffset
我們可以使用ZoneOffset類的of()方法來構造一個ZoneOffset對象。of方法接收一個字符串參數zoneOffset,表示偏移量。例如,”Z”表示0時區,”GMT+1″表示東一區偏移量為1小時。
ZoneOffset zoneOffset1 = ZoneOffset.of("+8");
ZoneOffset zoneOffset2 = ZoneOffset.of("GMT-8");
ZoneOffset zoneOffset3 = ZoneOffset.of("-06:30");
以上代碼分別構造了三個ZoneOffset對象,分別表示東八區、西八區和偏移量為負6小時30分的時區。
三、轉換
1. LocalDateTime與ZoneOffset的轉換
我們可以使用LocalDateTime的atOffset()方法將一個當地時間轉換為指定時區的時間。該方法接收一個ZoneOffset參數,表示轉換為該時區後的時間。另外,我們也可以使用ZoneOffset的getRules()方法獲得該時區的規則。
LocalDateTime localDateTime = LocalDateTime.now();
ZoneOffset zoneOffset = ZoneOffset.of("+8");
OffsetDateTime offsetDateTime = localDateTime.atOffset(zoneOffset);
System.out.println(offsetDateTime);
ZoneOffset zoneOffset2 = ZoneOffset.of("-06:30");
ZoneRules zoneRules = zoneOffset2.getRules();
System.out.println(zoneRules);
以上代碼將當前的當地時間轉換為東八區的時間,然後打印出來。同樣地,我們也可以將一個指定時區的時間轉換為當地時間。
OffsetDateTime offsetDateTime = OffsetDateTime.now();
ZoneOffset zoneOffset = ZoneOffset.of("+8");
LocalDateTime localDateTime = offsetDateTime.atZoneSameInstant(zoneOffset).toLocalDateTime();
System.out.println(localDateTime);
以上代碼將當前的東八區時間轉換為當地時間,然後打印出來。
2. ZoneId與ZoneOffset的轉換
我們也可以使用ZoneId與ZoneOffset進行轉換。ZoneId表示一個時區,它的實現類為ZoneRegion和ZoneRules。我們可以通過getRules()方法得到一個ZoneRules對象,它包含了當前時區的實際規則。
ZoneId zoneId = ZoneId.systemDefault();
ZoneOffset zoneOffset = zoneId.getRules().getOffset(Instant.now());
System.out.println(zoneOffset);
ZoneOffset zoneOffset2 = ZoneOffset.of("+8");
ZoneId zoneId2 = zoneOffset2.normalized();
System.out.println(zoneId2);
以上代碼獲取系統默認時區的偏移量,並打印出來。另外,我們也可以使用normalized()方法將一個ZoneOffset轉換為ZoneId。
四、計算
ZoneOffset也實現了Temporal架接口,我們可以使用Temporal提供的各種方法來計算時間。以下是一些常用的計算方法。
1. plusHours(), minusHours()
可以使用plusHours()方法增加指定小時數,使用minusHours()方法減少指定小時數。
OffsetDateTime offsetDateTime = OffsetDateTime.now();
System.out.println(offsetDateTime);
offsetDateTime = offsetDateTime.plusHours(2); //增加2小時
System.out.println(offsetDateTime);
offsetDateTime = offsetDateTime.minusHours(3); //減少3小時
System.out.println(offsetDateTime);
2. withOffsetSameInstant(ZoneOffset), withOffsetSameLocal(ZoneOffset)
withOffsetSameInstant()方法將當前時間調整到另一個指定時區,調整後的時間與原始時間保持瞬時點一致。withOffsetSameLocal()方法將當前時間調整到另一個指定時區,調整後的時間與原始時間在當前時區保持本地時間一致。
OffsetDateTime offsetDateTime = OffsetDateTime.now();
System.out.println(offsetDateTime);
OffsetDateTime offsetDateTime1 = offsetDateTime.withOffsetSameInstant(ZoneOffset.of("+5"));
System.out.println(offsetDateTime1);
OffsetDateTime offsetDateTime2 = offsetDateTime.withOffsetSameLocal(ZoneOffset.of("+3"));
System.out.println(offsetDateTime2);
3. toEpochSecond()
我們可以使用toEpochSecond()方法將一個時間轉換為從1970年1月1日格林威治標準時間開始的秒數。該方法返回值為long類型。
LocalDateTime localDateTime = LocalDateTime.parse("2022-11-11T11:11:11");
ZoneOffset zoneOffset = ZoneOffset.of("+8");
long second = localDateTime.toEpochSecond(zoneOffset);
System.out.println(second); //1668189071
五、總結
在Java8中,ZoneOffset類提供了處理時區信息的接口。我們可以使用ZoneOffset構造一個時區偏移量對象,使用LocalDateTime將當地時間轉換為指定時區的時間,使用Temporal提供的方法對時間進行計算,也可以將一個ZoneOffset轉換為ZoneId。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/246429.html