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