Table of Contents
ToggleZonedDateTime 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 等方法。