Java OffsetDateTime Methods - Java 147

Java OffsetDateTime Methods – Java 147

Java OffsetDateTime Methods

ISO-8601 日曆系統中與 UTC/格林威治有偏移的日期時間,帶有偏移量的日期時間,物件的值不會被改變,可以同時在不同的執行緒下被使用,儲存日期和時間,精確到奈秒以及與 UTC/格林威治的偏移量,介紹常見的 now 、 of 、 get 、 with 等方法, OffsetDateTime Java Methods 本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

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

單元測試

OffsetDateTime Methods Java 提供目前日期時間、建立、取得等操作 OffsetDateTime 。

now

OffsetDateTime Methods Java 建立一個 OffsetDateTime ,提供目前日期時間。

	@Test
	public void now() {
		OffsetDateTime offsetDateTime = OffsetDateTime.now();
		System.out.println(offsetDateTime);

		ZoneId zone = ZoneId.of("Egypt");
		offsetDateTime = OffsetDateTime.now(zone);
		System.out.println(offsetDateTime);

		zone = ZoneId.of("UTC+2");
		Clock clock = Clock.system(zone);
		offsetDateTime = OffsetDateTime.now(clock);
		System.out.println(offsetDateTime);

		zone = ZoneId.of("Etc/GMT-2");
		offsetDateTime = OffsetDateTime.now(zone);
		System.out.println(offsetDateTime);
	}
2023-07-06T17:27:11.513+08:00
2023-07-06T11:27:11.516+02:00
2023-07-06T11:27:11.516+02:00
2023-07-06T11:27:11.516+02:00

of

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

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

		long epochSecond = offsetDateTime.toEpochSecond();
		System.out.println(epochSecond);
		assertEquals(1703473443L, epochSecond);

		offsetDateTime = OffsetDateTime.of(LocalDateTime.of(2023, 12, 25, 5, 4, 3, 0), offset);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.of(LocalDate.of(2023, 12, 25), LocalTime.of(5, 4, 3, 0), offset);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());
	}
2023-12-25T05:04:03+02:00
1703473443
2023-12-25T05:04:03+02:00
2023-12-25T05:04:03+02:00

ofInstant

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

	@Test
	public void ofInstant() {
		ZoneId zone = ZoneId.of("Egypt");
		OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(Instant.parse("2023-12-25T03:04:03Z"), zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());
	}
2023-12-25T05:04:03+02:00

get

OffsetDateTime Methods Java 建立一個 OffsetDateTime ,取得指定欄位,如:年、月、日等。

	@Test
	public void get() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		int year = offsetDateTime.get(ChronoField.YEAR);
		System.out.println(year);
		assertEquals(2023, year);

		int month = offsetDateTime.get(ChronoField.MONTH_OF_YEAR);
		System.out.println(month);
		assertEquals(12, month);

		int dayOfMonth = offsetDateTime.get(ChronoField.DAY_OF_MONTH);
		System.out.println(dayOfMonth);
		assertEquals(25, dayOfMonth);

		int dayOfWeek = offsetDateTime.get(ChronoField.DAY_OF_WEEK);
		System.out.println(dayOfWeek);
		assertEquals(1, dayOfWeek);

		int dayOfYear = offsetDateTime.get(ChronoField.DAY_OF_YEAR);
		System.out.println(dayOfYear);
		assertEquals(359, dayOfYear);

		int hourOfDay = offsetDateTime.get(ChronoField.HOUR_OF_DAY);
		System.out.println(hourOfDay);
		assertEquals(5, hourOfDay);

		int minuteOfHour = offsetDateTime.get(ChronoField.MINUTE_OF_HOUR);
		System.out.println(minuteOfHour);
		assertEquals(4, minuteOfHour);

		int secondOfMinute = offsetDateTime.get(ChronoField.SECOND_OF_MINUTE);
		System.out.println(secondOfMinute);
		assertEquals(3, secondOfMinute);
	}
2023-06-06T07:08:09+03:00[Europe/Athens]

getValue

OffsetDateTime Methods in Java 建立一個 OffsetDateTime ,取得指定欄位,如:年、月、日等。

	@Test
	public void getValue() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		int year = offsetDateTime.getYear();
		System.out.println(year);
		assertEquals(2023, year);

		int month = offsetDateTime.getMonthValue();
		System.out.println(month);
		assertEquals(12, month);

		int dayOfMonth = offsetDateTime.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(25, dayOfMonth);

		int dayOfWeek = offsetDateTime.getDayOfWeek().getValue();
		System.out.println(dayOfWeek);
		assertEquals(1, dayOfWeek);

		int dayOfYear = offsetDateTime.getDayOfYear();
		System.out.println(dayOfYear);
		assertEquals(359, dayOfYear);

		int hour = offsetDateTime.getHour();
		System.out.println(hour);
		assertEquals(5, hour);

		int minute = offsetDateTime.getMinute();
		System.out.println(minute);
		assertEquals(4, minute);

		int second = offsetDateTime.getSecond();
		System.out.println(second);
		assertEquals(3, second);
	}
2023
12
25
1
359
5
4
3

with

OffsetDateTime Methods in Java 建立一個 OffsetDateTime ,調整指定欄位,如:年、月、日等,會傳回新物件。

	@Test
	public void with() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetDateTime result = offsetDateTime.withYear(2024);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = offsetDateTime.withMonth(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(1, month);

		result = offsetDateTime.withDayOfMonth(26);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(26, dayOfMonth);

		result = offsetDateTime.withHour(6);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = offsetDateTime.withMinute(5);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(5, minute);

		result = offsetDateTime.withSecond(4);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(4, second);
	}
2024
1
26
6
5
4

withTemporalAdjuster

OffsetDateTime Methods in Java 建立一個 OffsetDateTime ,使用 TemporalAdjuster 調整指定欄位,如:年、月、日等,會傳回新物件。

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

		result = offsetDateTime.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
		System.out.println(result);
		assertEquals("2023-12-30T05:04:03+02:00", result.toString());

		result = offsetDateTime.with(TemporalAdjusters.lastDayOfMonth());
		System.out.println(result);
		assertEquals("2023-12-31T05:04:03+02:00", result.toString());

		TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(14));
		result = offsetDateTime.with(temporalAdjuster);
		System.out.println(result);
		assertEquals("2024-01-08T05:04:03+02:00", result.toString());

		result = offsetDateTime.with(t -> t.plus(Duration.ofHours(1)));
		System.out.println(result);
		assertEquals("2023-12-25T06:04:03+02:00", result.toString());
	}
2023-12-26T05:04:03+02:00
2023-12-30T05:04:03+02:00
2023-12-31T05:04:03+02:00
2024-01-08T05:04:03+02:00
2023-12-25T06:04:03+02:00

toLocalDate

OffsetDateTime Functions in Java 建立一個 OffsetDateTime ,取得日期。

	@Test
	public void toLocalDate() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		LocalDate result = offsetDateTime.toLocalDate();
		System.out.println(result);
		assertEquals("2023-12-25", result.toString());
	}
2023-12-25

toLocalTime

OffsetDateTime Functions in Java 建立一個 OffsetDateTime ,取得時間。

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

toLocalDateTime

OffsetDateTime Functions in Java 建立一個 OffsetDateTime ,取得日期時間。

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

OffsetDateTimeMethodsTest.java

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

package org.ruoxue.java_147.datetime.offsetdatetime;

import static org.junit.Assert.*;

import java.time.Clock;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

import org.junit.Test;

public class OffsetDateTimeMethodsTest {

	@Test
	public void now() {
		OffsetDateTime offsetDateTime = OffsetDateTime.now();
		System.out.println(offsetDateTime);

		ZoneId zone = ZoneId.of("Egypt");
		offsetDateTime = OffsetDateTime.now(zone);
		System.out.println(offsetDateTime);

		zone = ZoneId.of("UTC+2");
		Clock clock = Clock.system(zone);
		offsetDateTime = OffsetDateTime.now(clock);
		System.out.println(offsetDateTime);

		zone = ZoneId.of("Etc/GMT-2");
		offsetDateTime = OffsetDateTime.now(zone);
		System.out.println(offsetDateTime);
	}

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

		long epochSecond = offsetDateTime.toEpochSecond();
		System.out.println(epochSecond);
		assertEquals(1703473443L, epochSecond);

		offsetDateTime = OffsetDateTime.of(LocalDateTime.of(2023, 12, 25, 5, 4, 3, 0), offset);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());

		offsetDateTime = OffsetDateTime.of(LocalDate.of(2023, 12, 25), LocalTime.of(5, 4, 3, 0), offset);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());
	}

	@Test
	public void ofInstant() {
		ZoneId zone = ZoneId.of("Egypt");
		OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(Instant.parse("2023-12-25T03:04:03Z"), zone);
		System.out.println(offsetDateTime);
		assertEquals("2023-12-25T05:04:03+02:00", offsetDateTime.toString());
	}

	@Test
	public void get() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		int year = offsetDateTime.get(ChronoField.YEAR);
		System.out.println(year);
		assertEquals(2023, year);

		int month = offsetDateTime.get(ChronoField.MONTH_OF_YEAR);
		System.out.println(month);
		assertEquals(12, month);

		int dayOfMonth = offsetDateTime.get(ChronoField.DAY_OF_MONTH);
		System.out.println(dayOfMonth);
		assertEquals(25, dayOfMonth);

		int dayOfWeek = offsetDateTime.get(ChronoField.DAY_OF_WEEK);
		System.out.println(dayOfWeek);
		assertEquals(1, dayOfWeek);

		int dayOfYear = offsetDateTime.get(ChronoField.DAY_OF_YEAR);
		System.out.println(dayOfYear);
		assertEquals(359, dayOfYear);

		int hourOfDay = offsetDateTime.get(ChronoField.HOUR_OF_DAY);
		System.out.println(hourOfDay);
		assertEquals(5, hourOfDay);

		int minuteOfHour = offsetDateTime.get(ChronoField.MINUTE_OF_HOUR);
		System.out.println(minuteOfHour);
		assertEquals(4, minuteOfHour);

		int secondOfMinute = offsetDateTime.get(ChronoField.SECOND_OF_MINUTE);
		System.out.println(secondOfMinute);
		assertEquals(3, secondOfMinute);
	}

	@Test
	public void getValue() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		int year = offsetDateTime.getYear();
		System.out.println(year);
		assertEquals(2023, year);

		int month = offsetDateTime.getMonthValue();
		System.out.println(month);
		assertEquals(12, month);

		int dayOfMonth = offsetDateTime.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(25, dayOfMonth);

		int dayOfWeek = offsetDateTime.getDayOfWeek().getValue();
		System.out.println(dayOfWeek);
		assertEquals(1, dayOfWeek);

		int dayOfYear = offsetDateTime.getDayOfYear();
		System.out.println(dayOfYear);
		assertEquals(359, dayOfYear);

		int hour = offsetDateTime.getHour();
		System.out.println(hour);
		assertEquals(5, hour);

		int minute = offsetDateTime.getMinute();
		System.out.println(minute);
		assertEquals(4, minute);

		int second = offsetDateTime.getSecond();
		System.out.println(second);
		assertEquals(3, second);
	}

	@Test
	public void with() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		OffsetDateTime result = offsetDateTime.withYear(2024);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = offsetDateTime.withMonth(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(1, month);

		result = offsetDateTime.withDayOfMonth(26);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(26, dayOfMonth);

		result = offsetDateTime.withHour(6);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = offsetDateTime.withMinute(5);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(5, minute);

		result = offsetDateTime.withSecond(4);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(4, second);
	}

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

		result = offsetDateTime.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
		System.out.println(result);
		assertEquals("2023-12-30T05:04:03+02:00", result.toString());

		result = offsetDateTime.with(TemporalAdjusters.lastDayOfMonth());
		System.out.println(result);
		assertEquals("2023-12-31T05:04:03+02:00", result.toString());

		TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(14));
		result = offsetDateTime.with(temporalAdjuster);
		System.out.println(result);
		assertEquals("2024-01-08T05:04:03+02:00", result.toString());

		result = offsetDateTime.with(t -> t.plus(Duration.ofHours(1)));
		System.out.println(result);
		assertEquals("2023-12-25T06:04:03+02:00", result.toString());
	}

	@Test
	public void toLocalDate() {
		ZoneOffset offset = ZoneOffset.ofHours(2);
		OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 12, 25, 5, 4, 3, 0, offset);
		LocalDate result = offsetDateTime.toLocalDate();
		System.out.println(result);
		assertEquals("2023-12-25", result.toString());
	}

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

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

心得分享

OffsetDateTime Functions in Java 儲存日期和時間,精確到奈秒,以及帶有偏移量的日期時間,用於處理不明確的本地日期時間,熟悉 OffsetDateTime Methods in Java 這些方法的操作,提升開發效率,在應用上相當廣泛。

發佈留言