OffsetDateTime in Java with Examples - Java 147

OffsetDateTime in Java with Examples – Java 147

OffsetDateTime in Java with Examples

儲存日期和時間,精確到奈秒,以及帶有偏移量的日期時間,用於處理不明確的本地日期時間,精確到奈秒以及與 UTC/格林威治的偏移量,OffsetDateTime in Java 介紹常見的 format 、 parse 、 ofInstant 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- datetime
       |                   +- offsetdatetime
       |                       +- OffsetDateTimeWithExamplesTest.java  

單元測試

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

format

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

	@Test
	public void format() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		String result = offsetDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03+02:00", result);

		offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		result = offsetDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03.123456789+02:00", result);

		result = offsetDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(result);
		assertEquals("2023/12/25 05:04:03.123+0200", result);
	}
2023-12-25T05:04:03+02:00
2023-12-25T05:04:03.123456789+02:00
2023/12/25 05:04:03.123+0200

parse

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

	@Test
	public void parse() {
		OffsetDateTime offsetDateTime = OffsetDateTime.parse("2023-12-25T05:04:03+02:00");
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.parse("2023-12-25T05:04:03.123456789+02:00");
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123456789+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.parse("2023/12/25 05:04:03.123+0200",
				DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123+02:00", offsetDateTime.toString());
	}
2023-12-25T05:04:03+02:00
2023-12-25T05:04:03.123456789+02:00
2023-12-25T05:04:03.123+02:00

from

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

	@Test
	public void from() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetDateTime result = OffsetDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03+02:00", result.toString());
	}
2023-12-25T05:04:03+02:00

toEpochSecond

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

	@Test
	public void toEpochSecond() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		long result = offsetDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1703473443L, result);
	}
1703473443

toEpochMilli

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

	@Test
	public void toEpochMilli() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		Instant instant = offsetDateTime.toInstant();
		long result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1703473443000L, result);

		offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		instant = offsetDateTime.toInstant();
		result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1703473443123L, result);
	}
1703473443000
1703473443123

ofEpochMilli

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

	@Test
	public void ofEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+2");
		Instant instant = Instant.ofEpochMilli(1703473443000L);
		OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant, zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		instant = Instant.ofEpochMilli(1703473443123L);
		offsetDateTime = OffsetDateTime.ofInstant(instant, zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123+02:00", offsetDateTime.toString());
	}
2023-12-25T05:04:03+02:00
2023-12-25T05:04:03.123+02:00

truncatedTo

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

	@Test
	public void truncatedTo() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		OffsetDateTime result = offsetDateTime.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-12-25T05:00+02:00", result.toString());

		result = offsetDateTime.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-12-25T00:00+02:00", result.toString());

		result = offsetDateTime.truncatedTo(ChronoUnit.MILLIS);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03.123+02:00", result.toString());
	}
2023-12-25T05:00+02:00
2023-12-25T00:00+02:00
2023-12-25T05:04:03.123+02:00

toOffsetTime

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

	@Test
	public void toOffsetTime() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetTime result = offsetDateTime.toOffsetTime();
		System.out.println(result);
		assertEquals("05:04:03+02:00", result.toString());
	}
05:04:03+02:00

toInstant

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

	@Test
	public void toInstant() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		Instant result = offsetDateTime.toInstant();
		System.out.println(result);
		assertEquals("2023-12-25T03:04:03Z", result.toString());
	}
2023-12-25T03:04:03Z

OffsetDateTimeWithExamplesTest.java

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

package org.ruoxue.java_147.datetime.offsetdatetime;

import static org.junit.Assert.*;

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

import org.junit.Test;

public class OffsetDateTimeWithExamplesTest {

	@Test
	public void format() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		String result = offsetDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03+02:00", result);

		offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		result = offsetDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03.123456789+02:00", result);

		result = offsetDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(result);
		assertEquals("2023/12/25 05:04:03.123+0200", result);
	}

	@Test
	public void parse() {
		OffsetDateTime offsetDateTime = OffsetDateTime.parse("2023-12-25T05:04:03+02:00");
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.parse("2023-12-25T05:04:03.123456789+02:00");
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123456789+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.parse("2023/12/25 05:04:03.123+0200",
				DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSSZ"));
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123+02:00", offsetDateTime.toString());
	}

	@Test
	public void from() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetDateTime result = OffsetDateTime.from(offsetDateTime);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03+02:00", result.toString());
	}

	@Test
	public void toEpochSecond() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		long result = offsetDateTime.toEpochSecond();
		System.out.println(result);
		assertEquals(1703473443L, result);
	}

	@Test
	public void toEpochMilli() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		Instant instant = offsetDateTime.toInstant();
		long result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1703473443000L, result);

		offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		instant = offsetDateTime.toInstant();
		result = instant.toEpochMilli();
		System.out.println(result);
		assertEquals(1703473443123L, result);
	}

	@Test
	public void ofEpochMilli() {
		ZoneId zone = ZoneId.of("UTC+2");
		Instant instant = Instant.ofEpochMilli(1703473443000L);
		OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant, zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		instant = Instant.ofEpochMilli(1703473443123L);
		offsetDateTime = OffsetDateTime.ofInstant(instant, zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03.123+02:00", offsetDateTime.toString());
	}

	@Test
	public void truncatedTo() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 123456789, offset);
		OffsetDateTime result = offsetDateTime.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-12-25T05:00+02:00", result.toString());

		result = offsetDateTime.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-12-25T00:00+02:00", result.toString());

		result = offsetDateTime.truncatedTo(ChronoUnit.MILLIS);
		System.out.println(result);
		assertEquals("2023-12-25T05:04:03.123+02:00", result.toString());
	}

	@Test
	public void toOffsetTime() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetTime result = offsetDateTime.toOffsetTime();
		System.out.println(result);
		assertEquals("05:04:03+02:00", result.toString());
	}

	@Test
	public void toInstant() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		Instant result = offsetDateTime.toInstant();
		System.out.println(result);
		assertEquals("2023-12-25T03:04:03Z", result.toString());
	}
}

心得分享

Java OffsetDateTime Example 具有偏移量的日期時間的不可變物件,繼承 Object 並實現 Temporal 、 TemporalAdjuster 接口,可以同時在不同的執行緒下被使用,提供了幾種 OffsetDateTime 常見方法的操作範例,在應用上相當廣泛,熟悉 Java OffsetDateTime 這些方法的操作,像是: format 、 parse 、 ofInstant 等方法。

發佈留言