Table of Contents
ToggleJava ZonedDateTime with Method
具有時區概念的時間戳記,帶有時區的日期時間為不可變的物件, 實現 ChronoZonedDateTime 接口, With Java ZonedDateTime 介紹常見的 withZoneSameInstant 、 withZoneSameLocal 、 withEarlierOffsetAtOverlap 、 withLaterOffsetAtOverlap 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- datetime
| +- zoneddatetime
| +- ZonedDateTimeWithTest.java
單元測試
ZonedDateTime With Java 提供日期時間建立等操作 ZonedDateTime 。
withZoneSameInstant
ZonedDateTime With Java 建立一個 ZonedDateTime,以不同時區相同 Instant 取得日期時間。
@Test
public void withZoneSameInstant() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0);
ZoneId zone = ZoneId.of("Europe/Athens");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
System.out.println(zonedDateTime);
zone = ZoneId.of("Asia/Shanghai");
zonedDateTime = zonedDateTime.withZoneSameInstant(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T12:08:09+08:00[Asia/Shanghai]", zonedDateTime.toString());
zone = ZoneId.of("Z");
zonedDateTime = zonedDateTime.withZoneSameInstant(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T04:08:09Z", zonedDateTime.toString());
}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T12:08:09+08:00[Asia/Shanghai]
2023-06-06T04:08:09Z
withZoneSameLocal
ZonedDateTime With Java 建立一個 ZonedDateTime,以不同時區相同 Local 取得日期時間。
@Test
public void withZoneSameLocal() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0);
ZoneId zone = ZoneId.of("Europe/Athens");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
System.out.println(zonedDateTime);
zone = ZoneId.of("Asia/Shanghai");
zonedDateTime = zonedDateTime.withZoneSameLocal(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T07:08:09+08:00[Asia/Shanghai]", zonedDateTime.toString());
zone = ZoneId.of("Z");
zonedDateTime = zonedDateTime.withZoneSameLocal(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T07:08:09Z", zonedDateTime.toString());
}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T07:08:09+08:00[Asia/Shanghai]
2023-06-06T07:08:09Z
withEarlierOffsetAtOverlap
ZonedDateTime With Java 建立一個 ZonedDateTime,取得日期時間。
@Test
public void withEarlierOffsetAtOverlap() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
zonedDateTime = zonedDateTime.withEarlierOffsetAtOverlap();
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-05:00[US/Central]", zonedDateTime.toString());
}
2023-11-05T01:30-06:00[US/Central]
2023-11-05T01:30-05:00[US/Central]
withLaterOffsetAtOverlap
ZonedDateTime With Example 建立一個 ZonedDateTime,取得日期時間。
@Test
public void withLaterOffsetAtOverlap() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
zonedDateTime = zonedDateTime.withLaterOffsetAtOverlap();
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
}
2023-11-05T01:30-06:00[US/Central]
2023-11-05T01:30-06:00[US/Central]
withFixedOffsetZone
ZonedDateTime With Example 建立一個 ZonedDateTime,取得日期時間。
@Test
public void withFixedOffsetZone() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.getZone());
System.out.println(zonedDateTime.getOffset());
assertEquals("US/Central", zonedDateTime.getZone().toString());
zonedDateTime = zonedDateTime.withFixedOffsetZone();
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.getZone());
System.out.println(zonedDateTime.getOffset());
assertEquals("-06:00", zonedDateTime.getZone().toString());
}
2023-11-05T01:30-06:00[US/Central]
US/Central
-06:00
2023-11-05T01:30-06:00
-06:00
-06:00
ZonedDateTimeWithTest.java
ZonedDateTime With Example 新增單元測試,驗證 Java ZonedDateTime With 是否符合預期。
package org.ruoxue.java_147.datetime.zoneddatetime;
import static org.junit.Assert.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import org.junit.Test;
public class ZonedDateTimeWithTest {
@Test
public void withZoneSameInstant() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0);
ZoneId zone = ZoneId.of("Europe/Athens");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
System.out.println(zonedDateTime);
zone = ZoneId.of("Asia/Shanghai");
zonedDateTime = zonedDateTime.withZoneSameInstant(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T12:08:09+08:00[Asia/Shanghai]", zonedDateTime.toString());
zone = ZoneId.of("Z");
zonedDateTime = zonedDateTime.withZoneSameInstant(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T04:08:09Z", zonedDateTime.toString());
}
@Test
public void withZoneSameLocal() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0);
ZoneId zone = ZoneId.of("Europe/Athens");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
System.out.println(zonedDateTime);
zone = ZoneId.of("Asia/Shanghai");
zonedDateTime = zonedDateTime.withZoneSameLocal(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T07:08:09+08:00[Asia/Shanghai]", zonedDateTime.toString());
zone = ZoneId.of("Z");
zonedDateTime = zonedDateTime.withZoneSameLocal(zone);
System.out.println(zonedDateTime);
assertEquals("2023-06-06T07:08:09Z", zonedDateTime.toString());
}
@Test
public void withEarlierOffsetAtOverlap() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
zonedDateTime = zonedDateTime.withEarlierOffsetAtOverlap();
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-05:00[US/Central]", zonedDateTime.toString());
}
@Test
public void withLaterOffsetAtOverlap() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
zonedDateTime = zonedDateTime.withLaterOffsetAtOverlap();
System.out.println(zonedDateTime);
assertEquals("2023-11-05T01:30-06:00[US/Central]", zonedDateTime.toString());
}
@Test
public void withFixedOffsetZone() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 5, 1, 30, 0);
ZoneId zone = ZoneId.of("US/Central");
ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zone, ZoneOffset.ofHours(-6));
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.getZone());
System.out.println(zonedDateTime.getOffset());
assertEquals("US/Central", zonedDateTime.getZone().toString());
zonedDateTime = zonedDateTime.withFixedOffsetZone();
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.getZone());
System.out.println(zonedDateTime.getOffset());
assertEquals("-06:00", zonedDateTime.getZone().toString());
}
}
心得分享
Java ZonedDateTime With 是一個不可變物件,可以同時在不同的執行緒下被使用,表示日期時間和時區。儲存所有日期和時間,精確到奈秒的時間和時區,使用區域 Offset 來處理本地日期時間,熟悉 ZonedDateTime With Example 這些方法的操作,例如: with 等方法,可以讓程式碼更加地簡潔及容易維護。