Java Instant クラス
Instant クラスは、Java 8 で導入された日時 API (java.time パッケージ) 内の重要なクラスであり、タイムライン上の瞬間的な点を表します。このクラスは主にタイムスタンプの記録に使用され、ナノ秒単位の精度を持ちます。
Instant クラスには以下の主な特徴があります:
- 1970-01-01T00:00:00Z (Unix エポック) からの時間を表します
- タイムゾーン情報を含みません
- 不変であり、スレッドセーフです
- ナノ秒単位の精度を持ちます (従来の Date クラスはミリ秒単位のみ)
Instant クラスの作成
現在の時刻を取得
例
Instant now = Instant.now(); // 現在の時刻を取得
エポック時間から作成
例
Instant instant1 = Instant.ofEpochSecond(3); // 1970-01-01T00:00:03Z
Instant instant2 = Instant.ofEpochSecond(3, 0); // 上記と同じ
Instant instant3 = Instant.ofEpochSecond(2, 1_000_000_000); // 3秒後の1ナノ秒
Instant instant4 = Instant.ofEpochSecond(4, -1_000_000_000); // 3秒前の1ナノ秒
Instant instant2 = Instant.ofEpochSecond(3, 0); // 上記と同じ
Instant instant3 = Instant.ofEpochSecond(2, 1_000_000_000); // 3秒後の1ナノ秒
Instant instant4 = Instant.ofEpochSecond(4, -1_000_000_000); // 3秒前の1ナノ秒
ミリ秒から作成
例
Instant instant = Instant.ofEpochMilli(1000); // 1970-01-01T00:00:01Z
Instant クラスのよく使われるメソッド
時間情報の取得
例
Instant instant = Instant.now();
long seconds = instant.getEpochSecond(); // 1970-01-01 からの秒数を取得
int nanos = instant.getNano(); // ナノ秒部分を取得
long seconds = instant.getEpochSecond(); // 1970-01-01 からの秒数を取得
int nanos = instant.getNano(); // ナノ秒部分を取得
時間の比較
例
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(10);
boolean isBefore = instant1.isBefore(instant2); // true
boolean isAfter = instant1.isAfter(instant2); // false
Instant instant2 = instant1.plusSeconds(10);
boolean isBefore = instant1.isBefore(instant2); // true
boolean isAfter = instant1.isAfter(instant2); // false
時間の演算
例
Instant instant = Instant.now();
// 10秒加算
Instant later = instant.plusSeconds(10);
// 5分減算
Instant earlier = instant.minus(Duration.ofMinutes(5));
// 2日4時間30分加算
Instant future = instant.plus(2, ChronoUnit.DAYS)
.plus(4, ChronoUnit.HOURS)
.plus(30, ChronoUnit.MINUTES);
// 10秒加算
Instant later = instant.plusSeconds(10);
// 5分減算
Instant earlier = instant.minus(Duration.ofMinutes(5));
// 2日4時間30分加算
Instant future = instant.plus(2, ChronoUnit.DAYS)
.plus(4, ChronoUnit.HOURS)
.plus(30, ChronoUnit.MINUTES);
Instant と他の日時クラスとの変換
Instant と LocalDateTime
例
Instant instant = Instant.now();
// Instant を LocalDateTime に変換
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// LocalDateTime を Instant に変換
Instant fromLdt = ldt.toInstant(ZoneOffset.UTC);
// Instant を LocalDateTime に変換
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// LocalDateTime を Instant に変換
Instant fromLdt = ldt.toInstant(ZoneOffset.UTC);
Instant と ZonedDateTime
例
Instant instant = Instant.now();
// Instant を ZonedDateTime に変換
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Shanghai"));
// ZonedDateTime を Instant に変換
Instant fromZdt = zdt.toInstant();
// Instant を ZonedDateTime に変換
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Shanghai"));
// ZonedDateTime を Instant に変換
Instant fromZdt = zdt.toInstant();
Instant と Date
例
// Instant を Date に変換
Date date = Date.from(instant);
// Date を Instant に変換
Instant fromDate = date.toInstant();
Date date = Date.from(instant);
// Date を Instant に変換
Instant fromDate = date.toInstant();
Instant クラスの実際の応用
イベントのタイムスタンプの記録
例
public class Event {
private String name;
private Instant timestamp;
public Event(String name) {
this.name = name;
this.timestamp = Instant.now();
}
// getters...
}
private String name;
private Instant timestamp;
public Event(String name) {
this.name = name;
this.timestamp = Instant.now();
}
// getters...
}
時間間隔の計算
例
Instant start = Instant.now();
// 何らかの操作を実行...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("操作の所要時間: " + duration.toMillis() + "ミリ秒");
// 何らかの操作を実行...
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("操作の所要時間: " + duration.toMillis() + "ミリ秒");
定時タスク
例
Instant now = Instant.now();
Instant nextRun = now.plus(1, ChronoUnit.HOURS);
while (Instant.now().isBefore(nextRun)) {
// 指定された時間まで待機
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 定時タスクを実行
System.out.println("定時タスクの実行時間: " + Instant.now());
Instant nextRun = now.plus(1, ChronoUnit.HOURS);
while (Instant.now().isBefore(nextRun)) {
// 指定された時間まで待機
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 定時タスクを実行
System.out.println("定時タスクの実行時間: " + Instant.now());
総合例
例
import java.time.Instant;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class InstantExample {
public static void main(String[] args) {
// 1. 現在の時刻の Instant を取得
Instant now = Instant.now();
System.out.println("現在の時刻: " + now);
// 2. 文字列から Instant を解析
Instant parsedInstant = Instant.parse("2023-05-15T10:15:30.00Z");
System.out.println("解析された Instant: " + parsedInstant);
// 3. 特定の時刻の Instant を作成
Instant epochInstant = Instant.ofEpochSecond(0);
System.out.println("エポック時間 (1970-01-01T00:00:00Z): " + epochInstant);
Instant specificInstant = Instant.ofEpochSecond(1684131330);
System.out.println("特定のタイムスタンプ: " + specificInstant);
// 4. 時間の演算
Instant later = now.plusSeconds(60); // 60秒加算
System.out.println("60秒後: " + later);
Instant earlier = now.minus(2, ChronoUnit.HOURS); // 2時間減算
System.out.println("2時間前: " + earlier);
// 5. 時間間隔の計算
Duration duration = Duration.between(earlier, later);
System.out.println("時間間隔: " + duration.toMinutes() + " 分");
// 6. 時間の比較
System.out.println("earlier は later より前か: " + earlier.isBefore(later));
System.out.println("later は earlier より後か: " + later.isAfter(earlier));
// 7. タイムスタンプの取得
System.out.println("エポックからの秒数: " + now.getEpochSecond());
System.out.println("ナノ秒部分: " + now.getNano());
}
}
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class InstantExample {
public static void main(String[] args) {
// 1. 現在の時刻の Instant を取得
Instant now = Instant.now();
System.out.println("現在の時刻: " + now);
// 2. 文字列から Instant を解析
Instant parsedInstant = Instant.parse("2023-05-15T10:15:30.00Z");
System.out.println("解析された Instant: " + parsedInstant);
// 3. 特定の時刻の Instant を作成
Instant epochInstant = Instant.ofEpochSecond(0);
System.out.println("エポック時間 (1970-01-01T00:00:00Z): " + epochInstant);
Instant specificInstant = Instant.ofEpochSecond(1684131330);
System.out.println("特定のタイムスタンプ: " + specificInstant);
// 4. 時間の演算
Instant later = now.plusSeconds(60); // 60秒加算
System.out.println("60秒後: " + later);
Instant earlier = now.minus(2, ChronoUnit.HOURS); // 2時間減算
System.out.println("2時間前: " + earlier);
// 5. 時間間隔の計算
Duration duration = Duration.between(earlier, later);
System.out.println("時間間隔: " + duration.toMinutes() + " 分");
// 6. 時間の比較
System.out.println("earlier は later より前か: " + earlier.isBefore(later));
System.out.println("later は earlier より後か: " + later.isAfter(earlier));
// 7. タイムスタンプの取得
System.out.println("エポックからの秒数: " + now.getEpochSecond());
System.out.println("ナノ秒部分: " + now.getNano());
}
}
出力結果は次のようになります:
当前时刻: 2025-05-01T03:19:09.345806Z 解析的 Instant: 2023-05-15T10:15:30Z 纪元时间 (1970-01-01T00:00:00Z): 1970-01-01T00:00:00Z 特定时间戳: 2023-05-15T06:15:30Z 60秒后: 2025-05-01T03:20:09.345806Z 2小时前: 2025-05-01T01:19:09.345806Z 时间间隔: 121 分钟 earlier 是否在 later 之前: true later 是否在 earlier 之后: true 从纪元开始的秒数: 1746069549 纳秒部分: 345806000
Instant クラスの注意事項
タイムゾーンの問題:Instant はタイムゾーン情報を含まず、常に UTC 時間を表します。特定のタイムゾーンの時間を表示する必要がある場合は、ZonedDateTime に変換する必要があります。
精度の問題:Instant の精度はオペレーティングシステムとハードウェアに依存し、ほとんどのシステムではミリ秒単位の精度しか提供できません。
不変性:Instant クラスは不変であり、すべての変更操作は新しい Instant オブジェクトを返します。
比較操作:2つの Instant を比較するときは、タイムスタンプを直接比較するのではなく、isBefore() メソッドと isAfter() メソッドを使用する必要があります。
シリアライゼーション:Instant クラスは Serializable インターフェースを実装しており、安全にシリアライズおよびデシリアライズできます。