Table of Contents
ToggleJava Instant Methods
是一個時間戳,利用 Unix Time 的秒數來儲存,不帶有任何時區,定義是從 UTC 時間 1970 年 ( Unix 元年 ) 1 月 1 日 00:00:00 開始計算的秒數,可以精確到奈秒,效果有點類似 System.currentTimeMillis() 的方法,不過 currentTimeMillis() 只精確到毫秒,介紹常見的 now 、 ofEpochMilli 、 ofEpochSecond 、 toEpochMilli 、 getEpochSecond 等方法, Instant Java Methods 本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- datetime
| +- instant
| +- InstantMethodsTest.java
單元測試
Instant Methods Java 提供目前時間戳、建立、取得等操作 Instant 。
now
Instant Methods Java 建立一個 Instant ,提供目前時間戳。
@Test
public void now() {
Instant instant = Instant.now();
System.out.println(instant);
ZoneId zone = ZoneId.of("America/New_York");
Clock clock = Clock.system(zone);
instant = Instant.now(clock);
System.out.println(instant);
zone = ZoneId.of("UTC-4");
clock = Clock.system(zone);
instant = Instant.now(clock);
System.out.println(instant);
}
2023-06-21T09:57:30.350Z
2023-06-21T09:57:30.465Z
2023-06-21T09:57:30.465Z
ofEpochMilli
Instant Methods Java 建立一個 Instant ,使用紀元毫秒,建立指定時間戳。
@Test
public void ofEpochMilli() {
Instant instant = Instant.ofEpochMilli(1694491506123L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06.123Z", instant.toString());
instant = Instant.ofEpochMilli(1694491506000L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06Z", instant.toString());
}
2023-09-12T04:05:06.123Z
2023-09-12T04:05:06Z
ofEpochSecond
Instant Methods Java 建立一個 Instant ,使用紀元秒,建立指定時間戳。
@Test
public void ofEpochSecond() {
Instant instant = Instant.ofEpochSecond(1694491506L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06Z", instant.toString());
instant = Instant.ofEpochSecond(1694491506L, 123456789L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06.123456789Z", instant.toString());
}
2023-09-12T04:05:06Z
2023-09-12T04:05:06.123456789Z
get
Instant Methods Java 建立一個 Instant ,取得指定欄位,如:毫秒、微秒、奈秒等。
@Test
public void get() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
int milliOfSecond = instant.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(123, milliOfSecond);
int microOfSecond = instant.get(ChronoField.MICRO_OF_SECOND);
System.out.println(microOfSecond);
assertEquals(123456, microOfSecond);
int nanoOfSecond = instant.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456789, nanoOfSecond);
}
123
123456
123456789
getValue
Instant Methods in Java 建立一個 Instant ,取得指定欄位,如:紀元秒、微秒等。
@Test
public void getValue() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
long epochSecond = instant.getEpochSecond();
System.out.println(epochSecond);
assertEquals(1694491506, epochSecond);
int nano = instant.getNano();
System.out.println(nano);
assertEquals(123456789, nano);
}
1694491506
123456789
with
Instant Methods in Java 建立一個 Instant ,調整指定欄位,如:毫秒、微秒、奈秒等,會傳回新物件。
@Test
public void with() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.with(ChronoField.MILLI_OF_SECOND, 223);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.223Z", result.toString());
result = instant.with(ChronoField.MICRO_OF_SECOND, 323456);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.323456Z", result.toString());
result = instant.with(ChronoField.NANO_OF_SECOND, 423456789);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.423456789Z", result.toString());
}
2023-09-12T04:05:06.223Z
2023-09-12T04:05:06.323456Z
2023-09-12T04:05:06.423456789Z
withTemporalAdjuster
Instant Methods in Java 建立一個 Instant ,使用 TemporalAdjuster 調整指定欄位,如:毫秒、奈秒等,會傳回新物件。
@Test
public void withTemporalAdjuster() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
TemporalAdjuster temporalAdjuster = t -> t.plus(Duration.ofMillis(100));
Instant result = instant.with(temporalAdjuster);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.223456789Z", result.toString());
result = instant.with(t -> t.plus(Duration.ofNanos(300000000)));
System.out.println(result);
assertEquals("2023-09-12T04:05:06.423456789Z", result.toString());
}
2023-09-12T04:05:06.223456789Z
2023-09-12T04:05:06.423456789Z
toEpochMilli
Instant Functions in Java 建立一個 Instant ,取得紀元毫秒。
@Test
public void toEpochMilli() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
long result = instant.toEpochMilli();
System.out.println(result);
assertEquals(1694491506123L, result);
instant = Instant.parse("2023-09-12T04:05:06Z");
result = instant.toEpochMilli();
System.out.println(result);
assertEquals(1694491506000L, result);
}
1694491506123
1694491506000
InstantMethodsTest.java
Instant Methods in Java 新增單元測試,驗證 Instant Functions in Java 是否符合預期。
package org.ruoxue.java_147.datetime.instant;
import static org.junit.Assert.*;
import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneId;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjuster;
import org.junit.Test;
public class InstantMethodsTest {
@Test
public void now() {
Instant instant = Instant.now();
System.out.println(instant);
ZoneId zone = ZoneId.of("America/New_York");
Clock clock = Clock.system(zone);
instant = Instant.now(clock);
System.out.println(instant);
zone = ZoneId.of("UTC-4");
clock = Clock.system(zone);
instant = Instant.now(clock);
System.out.println(instant);
}
@Test
public void ofEpochMilli() {
Instant instant = Instant.ofEpochMilli(1694491506123L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06.123Z", instant.toString());
instant = Instant.ofEpochMilli(1694491506000L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06Z", instant.toString());
}
@Test
public void ofEpochSecond() {
Instant instant = Instant.ofEpochSecond(1694491506L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06Z", instant.toString());
instant = Instant.ofEpochSecond(1694491506L, 123456789L);
System.out.println(instant);
assertEquals("2023-09-12T04:05:06.123456789Z", instant.toString());
}
@Test
public void get() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
int milliOfSecond = instant.get(ChronoField.MILLI_OF_SECOND);
System.out.println(milliOfSecond);
assertEquals(123, milliOfSecond);
int microOfSecond = instant.get(ChronoField.MICRO_OF_SECOND);
System.out.println(microOfSecond);
assertEquals(123456, microOfSecond);
int nanoOfSecond = instant.get(ChronoField.NANO_OF_SECOND);
System.out.println(nanoOfSecond);
assertEquals(123456789, nanoOfSecond);
}
@Test
public void getValue() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
long epochSecond = instant.getEpochSecond();
System.out.println(epochSecond);
assertEquals(1694491506, epochSecond);
int nano = instant.getNano();
System.out.println(nano);
assertEquals(123456789, nano);
}
@Test
public void with() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
Instant result = instant.with(ChronoField.MILLI_OF_SECOND, 223);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.223Z", result.toString());
result = instant.with(ChronoField.MICRO_OF_SECOND, 323456);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.323456Z", result.toString());
result = instant.with(ChronoField.NANO_OF_SECOND, 423456789);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.423456789Z", result.toString());
}
@Test
public void withTemporalAdjuster() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
TemporalAdjuster temporalAdjuster = t -> t.plus(Duration.ofMillis(100));
Instant result = instant.with(temporalAdjuster);
System.out.println(result);
assertEquals("2023-09-12T04:05:06.223456789Z", result.toString());
result = instant.with(t -> t.plus(Duration.ofNanos(300000000)));
System.out.println(result);
assertEquals("2023-09-12T04:05:06.423456789Z", result.toString());
}
@Test
public void toEpochMilli() {
Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
long result = instant.toEpochMilli();
System.out.println(result);
assertEquals(1694491506123L, result);
instant = Instant.parse("2023-09-12T04:05:06Z");
result = instant.toEpochMilli();
System.out.println(result);
assertEquals(1694491506000L, result);
}
}
心得分享
Instant Functions in Java 屬於 java.time,在時間軸中代表 date 和 time ,具有正確的 nanoseconds 的精度,精確到奈秒,所以需要更多的儲存空間,儲存的數字比 long 大,因此被存在兩個變數中,作為 Instant 初始化的一部分,建構子也需要兩個參數 Instant(long epochSecond, int nanos),熟悉 Instant Methods in Java 這些方法的操作,如: now 、 ofEpochMilli 、 ofEpochSecond 等,提升開發效率。