Java Instant Class - Java 147

Java Instant Class – Java 147

Java 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 等操作範例。

發佈留言