Java ZonedDateTime with Method - Java 147

Java ZonedDateTime with Method – Java 147

Java 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 等方法,可以讓程式碼更加地簡潔及容易維護。

發佈留言