Java Instant Methods - Java 147

Java Instant Methods – Java 147

Java 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 等,提升開發效率。

發佈留言