Java ZonedDateTime Class - Java 147

Java ZonedDateTime Class – Java 147

Java ZonedDateTime Class

表示帶有 ISO-8601 日曆系統中時區的日期時間,提供增加、減少、比較日期時間、或兩個日期時間差值的方法, ZonedDateTime Class 介紹常見的 plus 、 minus 、 isBefore 、 isAfter 、 until 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

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

單元測試

ZonedDateTime Class Java 提供日期時間加減、比較前後等操作 ZonedDateTime 。

plus

ZonedDateTime Class Java 建立一個 ZonedDateTime ,提供指定日期時間加法運算。

	@Test
	public void plus() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.plusYears(1);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = zonedDateTime.plusMonths(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(7, month);

		result = zonedDateTime.plusDays(1);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(7, dayOfMonth);

		result = zonedDateTime.plusHours(1);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(8, hour);

		result = zonedDateTime.plusMinutes(1);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(9, minute);

		result = zonedDateTime.plusSeconds(1);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(10, second);
	}
2024
7
7
8
9
10

plusTemporalAmount

ZonedDateTime Class Java 建立一個 ZonedDateTime ,使用 Period 、 Duration 提供指定日期時間加法運算。

	@Test
	public void plusTemporalAmount() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.plus(Period.ofYears(1));
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = zonedDateTime.plus(Period.ofMonths(1));
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(7, month);

		result = zonedDateTime.plus(Period.ofDays(1));
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(7, dayOfMonth);

		result = zonedDateTime.plus(Duration.ofHours(1));
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(8, hour);

		result = zonedDateTime.plus(Duration.ofMinutes(1));
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(9, minute);

		result = zonedDateTime.plus(Duration.ofSeconds(1));
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(10, second);
	}
2024
7
7
8
9
10

minus

ZonedDateTime Class Java 建立一個 ZonedDateTime ,提供指定日期時間減法運算。

	@Test
	public void minus() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.minusYears(1);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2022, year);

		result = zonedDateTime.minusMonths(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(5, month);

		result = zonedDateTime.minusDays(1);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(5, dayOfMonth);

		result = zonedDateTime.minusHours(1);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = zonedDateTime.minusMinutes(1);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(7, minute);

		result = zonedDateTime.minusSeconds(1);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(8, second);
	}
2022
5
5
6
7
8

minusTemporalAmount

ZonedDateTime Class Java 建立一個 ZonedDateTime ,使用 Period 、 Duration 提供指定日期時間減法運算。

	@Test
	public void minusTemporalAmount() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.minus(Period.ofYears(1));
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2022, year);

		result = zonedDateTime.minus(Period.ofMonths(1));
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(5, month);

		result = zonedDateTime.minus(Period.ofDays(1));
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(5, dayOfMonth);

		result = zonedDateTime.minus(Duration.ofHours(1));
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = zonedDateTime.minus(Duration.ofMinutes(1));
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(7, minute);

		result = zonedDateTime.minus(Duration.ofSeconds(1));
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(8, second);
	}
2022
5
5
6
7
8

isBefore

ZonedDateTime Class in Java 建立兩個 ZonedDateTime ,日期時間比對前後。

	@Test
	public void isBefore() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2024, 6, 6, 7, 8, 9, 0, zone);
		boolean result = zonedDateTime.isBefore(zonedDateTime2);
		System.out.println(result);
		assertTrue(result);

		result = zonedDateTime2.isBefore(zonedDateTime);
		System.out.println(result);
		assertFalse(result);
	}
true
false

isAfter

ZonedDateTime Class in Java 建立兩個 ZonedDateTime ,日期時間比對前後, Java ZonedDateTime Class Example 提供參考範例。

	@Test
	public void isAfter() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2022, 6, 6, 7, 8, 9, 0, zone);
		boolean result = zonedDateTime.isAfter(zonedDateTime2);
		System.out.println(result);
		assertTrue(result);

		result = zonedDateTime2.isAfter(zonedDateTime);
		System.out.println(result);
		assertFalse(result);
	}
true
false

until

ZonedDateTime Class in Java 建立兩個 ZonedDateTime ,取得日期時間的差值, Java ZonedDateTime Class Example 提供參考範例。

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

		result = zonedDateTime.until(zonedDateTime2, ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals(24, result);

		result = zonedDateTime.until(zonedDateTime2, ChronoUnit.MINUTES);
		System.out.println(result);
		assertEquals(1440, result);
	}
1
24
1440

ZonedDateTimeClassTest.java

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

package org.ruoxue.java_147.datetime.zoneddatetime;

import static org.junit.Assert.*;

import java.time.Duration;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;

import org.junit.Test;

public class ZonedDateTimeClassTest {

	@Test
	public void plus() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.plusYears(1);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = zonedDateTime.plusMonths(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(7, month);

		result = zonedDateTime.plusDays(1);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(7, dayOfMonth);

		result = zonedDateTime.plusHours(1);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(8, hour);

		result = zonedDateTime.plusMinutes(1);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(9, minute);

		result = zonedDateTime.plusSeconds(1);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(10, second);
	}

	@Test
	public void plusTemporalAmount() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.plus(Period.ofYears(1));
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2024, year);

		result = zonedDateTime.plus(Period.ofMonths(1));
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(7, month);

		result = zonedDateTime.plus(Period.ofDays(1));
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(7, dayOfMonth);

		result = zonedDateTime.plus(Duration.ofHours(1));
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(8, hour);

		result = zonedDateTime.plus(Duration.ofMinutes(1));
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(9, minute);

		result = zonedDateTime.plus(Duration.ofSeconds(1));
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(10, second);
	}

	@Test
	public void minus() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.minusYears(1);
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2022, year);

		result = zonedDateTime.minusMonths(1);
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(5, month);

		result = zonedDateTime.minusDays(1);
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(5, dayOfMonth);

		result = zonedDateTime.minusHours(1);
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = zonedDateTime.minusMinutes(1);
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(7, minute);

		result = zonedDateTime.minusSeconds(1);
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(8, second);
	}

	@Test
	public void minusTemporalAmount() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime result = zonedDateTime.minus(Period.ofYears(1));
		int year = result.getYear();
		System.out.println(year);
		assertEquals(2022, year);

		result = zonedDateTime.minus(Period.ofMonths(1));
		int month = result.getMonthValue();
		System.out.println(month);
		assertEquals(5, month);

		result = zonedDateTime.minus(Period.ofDays(1));
		int dayOfMonth = result.getDayOfMonth();
		System.out.println(dayOfMonth);
		assertEquals(5, dayOfMonth);

		result = zonedDateTime.minus(Duration.ofHours(1));
		int hour = result.getHour();
		System.out.println(hour);
		assertEquals(6, hour);

		result = zonedDateTime.minus(Duration.ofMinutes(1));
		int minute = result.getMinute();
		System.out.println(minute);
		assertEquals(7, minute);

		result = zonedDateTime.minus(Duration.ofSeconds(1));
		int second = result.getSecond();
		System.out.println(second);
		assertEquals(8, second);
	}

	@Test
	public void isBefore() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2024, 6, 6, 7, 8, 9, 0, zone);
		boolean result = zonedDateTime.isBefore(zonedDateTime2);
		System.out.println(result);
		assertTrue(result);

		result = zonedDateTime2.isBefore(zonedDateTime);
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void isAfter() {
		ZoneId zone = ZoneId.of("Europe/Athens");
		ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 6, 6, 7, 8, 9, 0, zone);
		ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2022, 6, 6, 7, 8, 9, 0, zone);
		boolean result = zonedDateTime.isAfter(zonedDateTime2);
		System.out.println(result);
		assertTrue(result);

		result = zonedDateTime2.isAfter(zonedDateTime);
		System.out.println(result);
		assertFalse(result);
	}

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

		result = zonedDateTime.until(zonedDateTime2, ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals(24, result);

		result = zonedDateTime.until(zonedDateTime2, ChronoUnit.MINUTES);
		System.out.println(result);
		assertEquals(1440, result);
	}
}

心得分享

Java ZonedDateTime Class Example 特定時區中的 LocalDateTime 並具有特定偏移量,以區分其他不明確的時間,屬於 java.time ,物件的值不會被改變,可以同時在不同的執行緒下被使用, ZonedDateTime Class in Java 提供 plus 、 minus 、 isBefore 、 isAfter 等操作範例。

發佈留言