ZonedDateTime in Java with Examples - Java 147

ZonedDateTime in Java with Examples – Java 147

ZonedDateTime in Java with Examples

是一個不可變物件,可以同時在不同的執行緒下被使用,表示日期時間和時區。儲存所有日期和時間,精確到奈秒的時間和時區,使用區域 Offset 來處理本地日期時間,ZonedDateTime in Java 介紹常見的 format 、 parse 、 ofInstant 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- datetime
       |                   +- zoneddatetime
       |                       +- ZonedDateTimeWithExamplesTest.java   

單元測試

ZonedDateTime Java 提供日期時間建立、格式化等操作 ZonedDateTime 。

format

ZonedDateTime Java 建立一個 ZonedDateTime ,格式化指定日期時間。

	@Test
	public void format() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		String result = zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", result);

		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		result = zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]", result);

		result = zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(result);
		assertEquals("2023/06/06 07:08:09.123+0300", result);
	}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T07:08:09.123456789+03:00[Europe/Athens]
2023/06/06 07:08:09.123+0300

parse

ZonedDateTime Java 建立一個 ZonedDateTime ,使用 String 建立指定日期時間。

	@Test
	public void parse() {
		ZonedDateTime zonedDateTime = ZonedDateTime.parse("2023-06-06T07:08:09+03:00[Europe/Athens]");
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.parse("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]");
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.parse("2023/06/06 07:08:09.123+0300",
				DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123+03:00", zonedDateTime.toString());
	}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T07:08:09.123456789+03:00[Europe/Athens]
2023-06-06T07:08:09.123+03:00

from

ZonedDateTime Java 建立一個 ZonedDateTime ,從另一個日期時間,建立指定日期時間。

	@Test
	public void from() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = ZonedDateTime.from(zonedDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", result.toString());

		LocalDateTime localDateTime = LocalDateTime.parse("2023-06-06T07:08:09");
		ZoneOffset zoneOffset = ZoneOffset.of("+03:00");
		OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, zoneOffset);
		System.out.println(offsetDateTime);
		result = ZonedDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());

		offsetDateTime = OffsetDateTime.of(2023, 6, 6, 7, 8, 9, 0, zoneOffset);
		result = ZonedDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());
	}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T07:08:09+03:00
2023-06-06T07:08:09+03:00
2023-06-06T07:08:09+03:00

ofInstant

Java ZonedDateTime 建立一個 ZonedDateTime ,使用 Instant 建立指定日期時間。

	@Test
	public void ofInstant() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.parse("2023-06-06T04:08:09Z"), zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.ofInstant(LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0), ZoneOffset.ofHours(3), zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());
	}
2023-06-06T07:08:09+03:00[Europe/Athens]
2023-06-06T07:08:09+03:00[Europe/Athens]

toEpochSecond

Java ZonedDateTime 建立一個 ZonedDateTime ,取得紀元秒,從 UTC 的 1970-01-01T00:00:00Z 起。

	@Test
	public void toEpochSecond() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		long result = zonedDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1686024489L, result);
		
		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		result = zonedDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1686024489L, result);
	}
1686024489
1686024489

toEpochMilli

Java ZonedDateTime 建立一個 ZonedDateTime ,取得紀元毫秒,從 UTC 的 1970-01-01T00:00:00Z 起。

	@Test
	public void toEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+3");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		Instant instant = zonedDateTime.toInstant();
		long result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1686024489000L, result);

		zone = ZoneId.of("UTC+3");
		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		instant = zonedDateTime.toInstant();
		result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1686024489123L, result);
	}
1686024489000
1686024489123

ofEpochMilli

Java ZonedDateTime 建立一個 ZonedDateTime ,將紀元毫秒轉成指定日期時間。

	@Test
	public void ofEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+3");
		Instant instant = Instant.ofEpochMilli(1686024489000L);
		ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[UTC+03:00]", zonedDateTime.toString());

		instant = Instant.ofEpochMilli(1686024489123L);
		zonedDateTime = ZonedDateTime.ofInstant(instant, zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123+03:00[UTC+03:00]", zonedDateTime.toString());
	}
2023-06-06T07:08:09+03:00[UTC+03:00]
2023-06-06T07:08:09.123+03:00[UTC+03:00]

truncatedTo

Java ZonedDateTime 建立一個 ZonedDateTime ,捨棄欄位到指定欄位。

	@Test
	public void truncatedTo() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		ZonedDateTime result = zonedDateTime.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-06-06T07:00+03:00[Europe/Athens]", result.toString());

		result = zonedDateTime.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-06-06T00:00+03:00[Europe/Athens]", result.toString());

		result = zonedDateTime.truncatedTo(ChronoUnit.MILLIS);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09.123+03:00[Europe/Athens]", result.toString());
	}
2023-06-06T07:00+03:00[Europe/Athens]
2023-06-06T00:00+03:00[Europe/Athens]
2023-06-06T07:08:09.123+03:00[Europe/Athens]

toOffsetDateTime

Java ZonedDateTime 建立一個 ZonedDateTime ,取得 OffsetDateTime 。

	@Test
	public void toOffsetDateTime() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		OffsetDateTime result = zonedDateTime.toOffsetDateTime();
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());
	}
2023-06-06T07:08:09+03:00

toInstant

Java ZonedDateTime 建立一個 ZonedDateTime ,取得 Instant 。

	@Test
	public void toInstant() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		Instant result = zonedDateTime.toInstant();
		System.out.println(result);
		assertEquals("2023-06-06T04:08:09Z", result.toString());
	}
2023-06-06T04:08:09Z

ZonedDateTimeWithExamplesTest.java

ZonedDateTime in Java 新增單元測試,驗證 Java ZonedDateTime Example 是否符合預期。

package org.ruoxue.java_147.datetime.zoneddatetime;

import static org.junit.Assert.*;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

import org.junit.Test;

public class ZonedDateTimeWithExamplesTest {

	@Test
	public void format() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		String result = zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", result);

		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		result = zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]", result);

		result = zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(result);
		assertEquals("2023/06/06 07:08:09.123+0300", result);
	}

	@Test
	public void parse() {
		ZonedDateTime zonedDateTime = ZonedDateTime.parse("2023-06-06T07:08:09+03:00[Europe/Athens]");
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.parse("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]");
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123456789+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.parse("2023/06/06 07:08:09.123+0300",
				DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123+03:00", zonedDateTime.toString());
	}

	@Test
	public void from() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = ZonedDateTime.from(zonedDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", result.toString());

		LocalDateTime localDateTime = LocalDateTime.parse("2023-06-06T07:08:09");
		ZoneOffset zoneOffset = ZoneOffset.of("+03:00");
		OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, zoneOffset);
		System.out.println(offsetDateTime);
		result = ZonedDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());

		offsetDateTime = OffsetDateTime.of(2023, 6, 6, 7, 8, 9, 0, zoneOffset);
		result = ZonedDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());
	}

	@Test
	public void ofInstant() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.parse("2023-06-06T04:08:09Z"), zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());

		zonedDateTime = ZonedDateTime.ofInstant(LocalDateTime.of(2023, 6, 6, 7, 8, 9, 0), ZoneOffset.ofHours(3), zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[Europe/Athens]", zonedDateTime.toString());
	}

	@Test
	public void toEpochSecond() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		long result = zonedDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1686024489L, result);

		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		result = zonedDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1686024489L, result);
	}

	@Test
	public void toEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+3");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		Instant instant = zonedDateTime.toInstant();
		long result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1686024489000L, result);

		zone = ZoneId.of("UTC+3");
		zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		instant = zonedDateTime.toInstant();
		result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1686024489123L, result);
	}

	@Test
	public void ofEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+3");
		Instant instant = Instant.ofEpochMilli(1686024489000L);
		ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09+03:00[UTC+03:00]", zonedDateTime.toString());

		instant = Instant.ofEpochMilli(1686024489123L);
		zonedDateTime = ZonedDateTime.ofInstant(instant, zone);
		System.out.println(zonedDateTime);
		assertEquals("2023-06-06T07:08:09.123+03:00[UTC+03:00]", zonedDateTime.toString());
	}

	@Test
	public void truncatedTo() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 123456789, zone);
		ZonedDateTime result = zonedDateTime.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-06-06T07:00+03:00[Europe/Athens]", result.toString());

		result = zonedDateTime.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-06-06T00:00+03:00[Europe/Athens]", result.toString());

		result = zonedDateTime.truncatedTo(ChronoUnit.MILLIS);
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09.123+03:00[Europe/Athens]", result.toString());
	}

	@Test
	public void toOffsetDateTime() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		OffsetDateTime result = zonedDateTime.toOffsetDateTime();
		System.out.println(result);
		assertEquals("2023-06-06T07:08:09+03:00", result.toString());
	}

	@Test
	public void toInstant() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		Instant result = zonedDateTime.toInstant();
		System.out.println(result);
		assertEquals("2023-06-06T04:08:09Z", result.toString());
	}
}

心得分享

Java ZonedDateTime Example 提供了一組可以帶入時區的日期時間 API ,物件的值不會被改變,可以同時在不同的執行緒下被使用,提供了幾種 ZonedDateTime 常見方法的操作範例,在應用上相當廣泛,熟悉 Java ZonedDateTime 這些方法的操作,像是: format 、 parse 、 ofInstant 等方法。

發佈留言