Table of Contents
ToggleJava Instant Class
常數 MIN 表示最小時間戳, MAX 表示最大時間戳, 調用 toString 輸出: 2023-09-12T04:05:07.123456789Z ,此種格式是遵循用於表示日期和時間的 ISO-8601 標準,提供增加時間、減少時間、比較時間、或兩個時間差值的方法, Instant Class 介紹常見的 plus 、 minus 、 isBefore 、 isAfter 、 until 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- datetime
| +- instant
| +- InstantClassTest.java
單元測試
Instant Class Java 提供時間戳加減、比較前後等操作 Instant 。
plus
Instant Class Java 建立一個 Instant ,提供指定時間戳加法運算。
@Test
public void plus() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.plusSeconds(1);
System.out.println(result);
assertEquals("2023-09-12T04:05:07.123456789Z", result.toString());
result = instant.plusMillis(1);
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(124, milliOfSecond);
result = instant.plusNanos(1);
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456790, nanoOfSecond);
}
2023-09-12T04:05:07.123456789Z
124
123456790
plusTemporalAmount
Instant Class Java 建立一個 Instant ,使用 Period 、 Duration 提供指定時間戳加法運算。
@Test
public void plusTemporalAmount() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.plus(Duration.ofSeconds(1));
System.out.println(result);
assertEquals("2023-09-12T04:05:07.123456789Z", result.toString());
result = instant.plus(Duration.ofMillis(1));
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(124, milliOfSecond);
result = instant.plus(Duration.ofNanos(1));
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456790, nanoOfSecond);
}
2023-09-12T04:05:07.123456789Z
124
123456790
minus
Instant Class Java 建立一個 Instant ,提供指定時間戳減法運算。
@Test
public void minus() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.minusSeconds(1);
System.out.println(result);
assertEquals("2023-09-12T04:05:05.123456789Z", result.toString());
result = instant.minusMillis(1);
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(122, milliOfSecond);
result = instant.minusNanos(1);
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456788, nanoOfSecond);
}
2023-09-12T04:05:05.123456789Z
122
123456788
minusTemporalAmount
Instant Class Java 建立一個 Instant ,使用 Period 、 Duration 提供指定時間戳減法運算。
@Test
public void minusTemporalAmount() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.minus(Duration.ofSeconds(1));
System.out.println(result);
assertEquals("2023-09-12T04:05:05.123456789Z", result.toString());
result = instant.minus(Duration.ofMillis(1));
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(122, milliOfSecond);
result = instant.minus(Duration.ofNanos(1));
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456788, nanoOfSecond);
}
2023-09-12T04:05:05.123456789Z
122
123456788
isBefore
Instant Class in Java 建立兩個 Instant ,時間戳比對前後。
@Test
public void isBefore() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant instant2 = Instant.parse("2024-09-12T04:05:06.123456789Z");
boolean result = instant.isBefore(instant2);
System.out.println(result);
assertTrue(result);
result = instant2.isBefore(instant);
System.out.println(result);
assertFalse(result);
}
true
false
isAfter
Instant Class in Java 建立兩個 Instant ,時間戳比對前後。
@Test
public void isAfter() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 8, 3, 1, 2, 3);
LocalDateTime localDateTime2 = LocalDateTime.of(2022, 8, 3, 1, 2, 3);
boolean result = localDateTime.isAfter(localDateTime2);
System.out.println(result);
assertTrue(result);
result = localDateTime2.isAfter(localDateTime);
System.out.println(result);
assertFalse(result);
}
true
false
until
Instant Class in Java 建立兩個 Instant ,取得時間戳的差值。
@Test
public void until() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant instant2 = Instant.parse("2023-09-12T04:06:06.123456789Z");
long result = instant.until(instant2, ChronoUnit.NANOS);
System.out.println(result);
assertEquals(60000000000L, result);
result = instant.until(instant2, ChronoUnit.MICROS);
System.out.println(result);
assertEquals(60000000L, result);
result = instant.until(instant2, ChronoUnit.MILLIS);
System.out.println(result);
assertEquals(60000L, result);
result = instant.until(instant2, ChronoUnit.SECONDS);
System.out.println(result);
assertEquals(60L, result);
}
60000000000
60000000
60000
60
atZone
Instant Class in Java 建立一個 Instant ,使用 ZoneId 取得指定時間戳 ZonedDateTime。
@Test
public void atZone() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
ZoneId zone = ZoneId.of("UTC+8");
ZonedDateTime result = instant.atZone(zone);
System.out.println(result);
assertEquals("2023-09-12T12:05:06.123456789+08:00[UTC+08:00]", result.toString());
}
2023-09-12T12:05:06.123456789+08:00[UTC+08:00]
atOffset
Instant Class in Java 建立一個 Instant ,使用 ZoneOffset 取得指定時間戳 OffsetDateTime。
@Test
public void atOffset() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
OffsetDateTime result = instant.atOffset(ZoneOffset.ofHours(-4));
System.out.println(result);
assertEquals("2023-09-12T00:05:06.123456789-04:00", result.toString());
}
2023-09-12T00:05:06.123456789-04:00
InstantClassTest.java
Instant Class in Java 新增單元測試,驗證 Java Instant Class Example 是否符合預期。
package org.ruoxue.java_147.datetime.instant;
import static org.junit.Assert.*;
import java.time.Duration;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import org.junit.Test;
public class InstantClassTest {
@Test
public void plus() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.plusSeconds(1);
System.out.println(result);
assertEquals("2023-09-12T04:05:07.123456789Z", result.toString());
result = instant.plusMillis(1);
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(124, milliOfSecond);
result = instant.plusNanos(1);
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456790, nanoOfSecond);
}
@Test
public void plusTemporalAmount() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.plus(Duration.ofSeconds(1));
System.out.println(result);
assertEquals("2023-09-12T04:05:07.123456789Z", result.toString());
result = instant.plus(Duration.ofMillis(1));
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(124, milliOfSecond);
result = instant.plus(Duration.ofNanos(1));
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456790, nanoOfSecond);
}
@Test
public void minus() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.minusSeconds(1);
System.out.println(result);
assertEquals("2023-09-12T04:05:05.123456789Z", result.toString());
result = instant.minusMillis(1);
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(122, milliOfSecond);
result = instant.minusNanos(1);
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456788, nanoOfSecond);
}
@Test
public void minusTemporalAmount() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.minus(Duration.ofSeconds(1));
System.out.println(result);
assertEquals("2023-09-12T04:05:05.123456789Z", result.toString());
result = instant.minus(Duration.ofMillis(1));
int milliOfSecond = result.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(122, milliOfSecond);
result = instant.minus(Duration.ofNanos(1));
int nanoOfSecond = result.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456788, nanoOfSecond);
}
@Test
public void isBefore() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant instant2 = Instant.parse("2024-09-12T04:05:06.123456789Z");
boolean result = instant.isBefore(instant2);
System.out.println(result);
assertTrue(result);
result = instant2.isBefore(instant);
System.out.println(result);
assertFalse(result);
}
@Test
public void isAfter() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant instant2 = Instant.parse("2022-09-12T04:05:06.123456789Z");
boolean result = instant.isAfter(instant2);
System.out.println(result);
assertTrue(result);
result = instant2.isAfter(instant);
System.out.println(result);
assertFalse(result);
}
@Test
public void until() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant instant2 = Instant.parse("2023-09-12T04:06:06.123456789Z");
long result = instant.until(instant2, ChronoUnit.NANOS);
System.out.println(result);
assertEquals(60000000000L, result);
result = instant.until(instant2, ChronoUnit.MICROS);
System.out.println(result);
assertEquals(60000000L, result);
result = instant.until(instant2, ChronoUnit.MILLIS);
System.out.println(result);
assertEquals(60000L, result);
result = instant.until(instant2, ChronoUnit.SECONDS);
System.out.println(result);
assertEquals(60L, result);
}
@Test
public void atZone() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
ZoneId zone = ZoneId.of("UTC+8");
ZonedDateTime result = instant.atZone(zone);
System.out.println(result);
assertEquals("2023-09-12T12:05:06.123456789+08:00[UTC+08:00]", result.toString());
}
@Test
public void atOffset() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
OffsetDateTime result = instant.atOffset(ZoneOffset.ofHours(-4));
System.out.println(result);
assertEquals("2023-09-12T00:05:06.123456789-04:00", result.toString());
}
}
心得分享
Java Instant Class Example 時間戳,利用 Unix Time 的秒數來儲存,不帶有任何時區,在時間軸中代表 date 和 time,精確到奈秒,物件的值不會被改變,可以同時在不同的執行緒下被使用, Instant Class in Java 提供 plus 、 minus 、 isBefore 、 isAfter 、 until 等操作範例。