Table of Contents
ToggleInstant 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 等方法。