Table of Contents
ToggleJava 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 等操作範例。