Instant in Java with Examples - Java 147

Instant in Java with Examples – Java 147

Instant in Java with Examples

介紹常見的 format 、 parse 、 from 等方法,Instant in Java 時間戳定義是從 UTC 時間 1970 年 ( Unix 元年 ) 1 月 1 日 00:00:00 開始計算的秒數,可以精確到奈秒,屬於 java.time,在時間軸中代表 date 和 time,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- datetime
       |                   +- instant
       |                       +- InstantWithExamplesTest.java   

單元測試

Instant Java 提供時間戳建立、格式化等操作 Instant 。

format

建立一個 Instant ,格式化指定時間戳。

	@Test
	public void format() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
		String result = formatter.format(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06.123456789Z", result);

		ZoneId zone = ZoneId.of("UTC+8");
		formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS").withZone(zone);
		result = formatter.format(instant);
		System.out.println(result);
		assertEquals("2023/09/12 12:05:06.123", result);
	}
2023-09-12T04:05:06.123456789Z
2023/09/12 12:05:06.123

parse

Instant Java 建立一個 Instant ,使用 String 建立指定時間戳。

	@Test
	public void parse() {
		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

from

Instant Java 建立一個 Instant ,從另一個時間戳,建立指定時間戳。

	@Test
	public void from() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant result = Instant.from(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06.123456789Z", result.toString());

		instant = Instant.parse("2023-09-12T04:05:06Z");
		result = Instant.from(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06Z", result.toString());
	}
2023-09-12T04:05:06.123456789Z
2023-09-12T04:05:06Z

truncatedTo

Java Instant 建立一個 Instant ,捨棄欄位到指定欄位。

	@Test
	public void truncatedTo() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant result = instant.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-09-12T04:00:00Z", result.toString());

		result = instant.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-09-12T00:00:00Z", result.toString());
	}
2023-09-12T04:00:00Z
2023-09-12T00:00:00Z

compareTo

Java Instant 建立兩個 Instant ,比較大小。

	@Test
	public void compareTo() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant instant2 = Instant.parse("2024-09-12T04:05:06.123456789Z");
		int result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result < 0);

		instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		instant2 = Instant.parse("2023-09-12T04:05:06.123456789Z");
		result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result == 0);

		instant = Instant.parse("2024-09-12T04:05:06.123456789Z");
		instant2 = Instant.parse("2023-09-12T04:05:06.123456789Z");
		result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result > 0);
	}
-1
0
1

query

Java Instant 建立一個 Instant ,查詢指定欄位。

	@Test
	public void query() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		String result = instant.query(TemporalQueries.precision()).toString();
		System.out.println(result);
		assertEquals("Nanos", result);

		instant = Instant.now();
		ZoneOffset offset = ZoneOffset.ofHours(-4);
		OffsetDateTime offsetDateTime = instant.atOffset(offset);
		System.out.println(offsetDateTime);
		ZoneOffset zoneOffset = offsetDateTime.query(TemporalQueries.offset());
		System.out.println(zoneOffset);
		assertEquals("-04:00", zoneOffset.toString());

		ZoneId zone = ZoneId.of("America/New_York");
		ZonedDateTime zonedDateTime = instant.atZone(zone);
		System.out.println(zonedDateTime);
		ZoneId zoneId = zonedDateTime.query(TemporalQueries.zoneId());
		System.out.println(zoneId);
		assertEquals("America/New_York", zoneId.toString());
	}
Nanos
2023-09-25T11:17:04.173-04:00
-04:00
2023-09-25T11:17:04.173-04:00[America/New_York]
America/New_York

range

Java Instant 建立一個 Instant ,取得指定欄位區間。

	@Test
	public void range() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		ValueRange result = instant.range(ChronoField.MILLI_OF_SECOND);
		System.out.println(result);
		assertEquals("0 - 999", result.toString());

		instant.range(ChronoField.NANO_OF_SECOND);
		System.out.println(result);
		assertEquals("0 - 999", result.toString());
	}
0 - 999
0 - 999

InstantWithExamplesTest.java

Instant in Java 新增單元測試,驗證是否符合預期。

package org.ruoxue.java_147.datetime.instant;

import static org.junit.Assert.*;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalQueries;
import java.time.temporal.ValueRange;

import org.junit.Test;

public class InstantWithExamplesTest {

	@Test
	public void format() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
		String result = formatter.format(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06.123456789Z", result);

		ZoneId zone = ZoneId.of("UTC+8");
		formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS").withZone(zone);
		result = formatter.format(instant);
		System.out.println(result);
		assertEquals("2023/09/12 12:05:06.123", result);
	}

	@Test
	public void parse() {
		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);
	}

	@Test
	public void from() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant result = Instant.from(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06.123456789Z", result.toString());

		instant = Instant.parse("2023-09-12T04:05:06Z");
		result = Instant.from(instant);
		System.out.println(result);
		assertEquals("2023-09-12T04:05:06Z", result.toString());
	}

	@Test
	public void truncatedTo() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant result = instant.truncatedTo(ChronoUnit.HOURS);
		System.out.println(result);
		assertEquals("2023-09-12T04:00:00Z", result.toString());

		result = instant.truncatedTo(ChronoUnit.DAYS);
		System.out.println(result);
		assertEquals("2023-09-12T00:00:00Z", result.toString());
	}

	@Test
	public void compareTo() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		Instant instant2 = Instant.parse("2024-09-12T04:05:06.123456789Z");
		int result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result < 0);

		instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		instant2 = Instant.parse("2023-09-12T04:05:06.123456789Z");
		result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result == 0);

		instant = Instant.parse("2024-09-12T04:05:06.123456789Z");
		instant2 = Instant.parse("2023-09-12T04:05:06.123456789Z");
		result = instant.compareTo(instant2);
		System.out.println(result);
		assertTrue(result > 0);
	}

	@Test
	public void query() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		String result = instant.query(TemporalQueries.precision()).toString();
		System.out.println(result);
		assertEquals("Nanos", result);

		instant = Instant.now();
		ZoneOffset offset = ZoneOffset.ofHours(-4);
		OffsetDateTime offsetDateTime = instant.atOffset(offset);
		System.out.println(offsetDateTime);
		ZoneOffset zoneOffset = offsetDateTime.query(TemporalQueries.offset());
		System.out.println(zoneOffset);
		assertEquals("-04:00", zoneOffset.toString());

		ZoneId zone = ZoneId.of("America/New_York");
		ZonedDateTime zonedDateTime = instant.atZone(zone);
		System.out.println(zonedDateTime);
		ZoneId zoneId = zonedDateTime.query(TemporalQueries.zoneId());
		System.out.println(zoneId);
		assertEquals("America/New_York", zoneId.toString());
	}

	@Test
	public void range() {
		Instant instant = Instant.parse("2023-09-12T04:05:06.123456789Z");
		ValueRange result = instant.range(ChronoField.MILLI_OF_SECOND);
		System.out.println(result);
		assertEquals("0 - 999", result.toString());

		instant.range(ChronoField.NANO_OF_SECOND);
		System.out.println(result);
		assertEquals("0 - 999", result.toString());
	}
}

心得分享

Java Instant Example 提供了時間戳的 API ,內部儲存使用了兩個變數,seconds 表示從 1970-01-01 00:00:00 開始到現在的秒數,nanos 表示奈秒,其值不會超過 999,999,999,提供了幾種 Instant 常見方法的操作範例,在應用上相當廣泛,熟悉 Java Instant 這些方法的操作,像是: format 、 parse 、 from 等方法。

發佈留言