広告

Java : 現在時刻(日時)の取得いろいろ

Java の標準 API には、現在時刻(日時) の取得に使えるものがいくつかあります。
Instant.now、ZonedDateTime.now、System.currentTimeMillis などなど。

そんな現在時刻の取得方法をご紹介します。


簡単なまとめ

※この記事のコード例は、デフォルトのタイムゾーンが "Asia/Tokyo" の環境で実行しています。

final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo
System.out.println(zoneId.getDisplayName(TextStyle.FULL, Locale.JAPAN)); // 日本時間

Java 8 以降 (おすすめ)

クラス メソッド 使用例
Instant Instant now()

現在時刻の Instant を返します。

※そのまま表示すると、日本標準時から -9時間の時差があります。
// 日本時間の 2023/10/10 17:00 くらいに実行した例です。
final var now = Instant.now();

// 日本標準時より -9 時間となります。

// 2023-10-10T08:00:23.050909200Z
System.out.println(now);
ZonedDateTime ZonedDateTime now()

デフォルトのタイムゾーンを使い、現在時刻の ZonedDateTime を返します。
// 日本時間の 2023/10/10 17:00 くらいに実行した例です。
final var now = ZonedDateTime.now();

// 2023-10-10T17:00:23.058902700+09:00[Asia/Tokyo]
System.out.println(now);
LocalDateTime LocalDateTime now()

デフォルトのタイムゾーンを使い、現在時刻の LocalDateTime を返します。

※LocalDateTime 自身はタイムゾーンを持ちません。
// 日本時間の 2023/10/10 17:00 くらいに実行した例です。
final var now = LocalDateTime.now();

// 2023-10-10T17:00:23.058902700
System.out.println(now);
Clock Clock は、タイムゾーンを持つ時計です。

他クラスの now メソッドと同じことができます。後述しますが、ユニットテストでダミーの現在時刻を取得させたい、というときに便利です。
// 日本時間の 2023/10/10 17:00 くらいに実行した例です。
final var clock = Clock.systemDefaultZone();
final var now1 = clock.instant();

// 2023-10-10T08:00:23.058902700Z
System.out.println(now1);

final var now2 = ZonedDateTime.now(clock);

// 2023-10-10T17:00:23.058902700+09:00[Asia/Tokyo]
System.out.println(now2);

Java 8 以降を使っている場合は、これらの API を使うことをおすすめします。

Instant や ZonedDateTime, LocalDateTime, タイムゾーンについては「日付・時刻の基本」の記事でも解説しています。
よろしければそちらもご参照いただけたら幸いです。

Java 8 より前のバージョン

クラス メソッド 使用例
System long currentTimeMillis()

UTC 1970-01-01 00:00 からの経過ミリ秒を返します。
// 日本時間の 2023/01/04 19:27 くらいに実行した例です。
final var now = System.currentTimeMillis();

// 1672828047957
System.out.println(now);
Calendar Calendar getInstance()

デフォルトのタイムゾーンおよびロケールを使用して、現在時刻の Calendar を取得します。
// 日本時間の 2023/01/04 19:27 くらいに実行した例です。
final var now = Calendar.getInstance();

// Asia/Tokyo
System.out.println(now.getTimeZone().getID());

// 2023-01-04 19:27:27
System.out.printf("%tF %tT", now, now);
Date Date()

現在時刻で Date を作成します。
// 日本時間の 2023/01/04 19:27 くらいに実行した例です。
final var now = new Date();

// 1672828047964
System.out.println(now.getTime());

CalendarDate はすでに古い API です。
もし Java 8 以降を使っている場合、代わりとなる新しいAPIが java.time パッケージ にあるのでそちらを使いましょう。
本記事でも、Calendar と Date の解説は割愛させていただきます。

関連記事:Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう

System.currentTimeMillis については、Instant の簡易版的には使ってもよいかなと思います。


Instant.now

public static Instant now()
システム・クロックから現在のインスタントを取得します。

Instant は Java 8 から追加された "時点" を表すクラスです。
ナノ秒の精度で現在時刻を取得できます。タイムゾーンは UTC(協定世界時) 固定です。

final var now = Instant.now();

// UTC
System.out.println(now); // 2023-01-04T10:37:22.187867500Z

// UTC 1970-01-01 00:00からの経過秒を取得
System.out.println(now.getEpochSecond()); // 1672828642

// ナノ秒の部分を取得
System.out.println(now.getNano()); // 187867500

// 日本標準時に変換(UTCに比べて+9時間)
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

final var dateTime = ZonedDateTime.ofInstant(now, zoneId);
System.out.println(dateTime); // 2023-01-04T19:37:22.187867500+09:00[Asia/Tokyo]

ZonedDateTime.now

public static ZonedDateTime now()
デフォルトのタイムゾーンのシステム・クロックから現在の日付/時間を取得します。

デフォルトのタイムゾーンで現在日時を取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

final var now = ZonedDateTime.now();

// 日本標準時(JST)
System.out.println(now); // 2023-01-04T19:40:46.523681500+09:00[Asia/Tokyo]

// UTC時間で表示。(日本標準時より-9時間となります)
System.out.println(now.toInstant()); // 2023-01-04T10:40:46.523681500Z

LocalDateTime.now

public static LocalDateTime now()
デフォルトのタイムゾーンのシステム・クロックから現在の日付/時間を取得します。

デフォルトのタイムゾーンで現在日時を取得します。
ただし、結果となる LocalDateTime にはタイムゾーン情報は保持されません。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

final var now = LocalDateTime.now();

// 日本標準時 (ただしタイムゾーンなし)
System.out.println(now); // 2023-01-04T19:42:05.052134300

LocalDateLocalTime も同じように now メソッドが使えます。

final var now = LocalDate.now();

// 日本標準時 (ただしタイムゾーンなし)
System.out.println(now); // 2023-01-04
final var now = LocalTime.now();

// 日本標準時 (ただしタイムゾーンなし)
System.out.println(now); // 19:42:05.058130600

Clock

タイムゾーンを使用して現在の時点、日付および時間へのアクセスを提供するクロックです。

Clock クラスを使うと、単純に現在時刻を返すだけでなく、

  • 固定の時刻を返す
  • 現在時刻の xx 時間後を返す

といったことも可能です。

ユニットテストなどで

  • 現在時刻を特定の時刻にして実行したい

というケースで便利ですね。

final var clock = Clock.systemDefaultZone();

final var now = ZonedDateTime.now(clock);
System.out.println(now); // 2023-10-10T17:00:39.440316600+09:00[Asia/Tokyo]

final var instant = clock.instant();
System.out.println(instant); // 2023-10-10T08:00:39.441315Z
final var clock = Clock.systemUTC();

final var now = ZonedDateTime.now(clock);
System.out.println(now); // 2023-10-10T08:00:39.450310700Z

final var instant = clock.instant();
System.out.println(instant); // 2023-10-10T08:00:39.450310700Z
final var dateTime = ZonedDateTime.of(1999, 12, 31, 0, 0, 0, 0, ZoneOffset.UTC);
final var fixedClock = Clock.fixed(dateTime.toInstant(), dateTime.getZone());

{
    // 固定で 1999-12-31 00:00 を返します。
    final var now = ZonedDateTime.now(fixedClock);
    System.out.println(now); // 1999-12-31T00:00Z

    final var instant = fixedClock.instant();
    System.out.println(instant); // 1999-12-31T00:00:00Z
}
{
    // 1日後を返します。
    final var offsetClock = Clock.offset(fixedClock, Duration.ofDays(1));

    final var now = ZonedDateTime.now(offsetClock);
    System.out.println(now); // 2000-01-01T00:00Z

    final var instant = offsetClock.instant();
    System.out.println(instant); // 2000-01-01T00:00:00Z
}

System.currentTimeMillis

public static long currentTimeMillis()
ミリ秒で表される現在の時間を返します。

Java 1 から存在する伝統的な API です。
UTC 1970-01-01 00:00 からの経過ミリ秒を返します。

final var millis = System.currentTimeMillis();
System.out.println(millis); // 1672828992448

final var now = Instant.ofEpochMilli(millis);

// UTC
System.out.println(now); // 2023-01-04T10:43:12.448Z

final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

// 日本標準時(UTCに比べて+9時間)
final var dateTime = ZonedDateTime.ofInstant(now, zoneId);
System.out.println(dateTime); // 2023-01-04T19:43:12.448+09:00[Asia/Tokyo]

メモ

  • 似たAPIに System.nanoTime があります。
    ただし、nanoTime は現在時刻としては使えないのでご注意ください。
    nanoTime はあくまで経過時間を計測するためのAPIです。

UTC から日本標準時(JST) に変換

Instant.now で取得した時刻は UTC を基準としています。
もし日本標準時に変換したい場合は ZonedDateTimeLocalDateTime を使います。

final var now = Instant.now();
System.out.println(now); // 2023-01-04T10:52:33.130368400Z

final var zoneId = ZoneId.of("Asia/Tokyo");
System.out.println(zoneId); // Asia/Tokyo

// UTCから+9時間された時刻になります。
final var dateTime = ZonedDateTime.ofInstant(now, zoneId);
System.out.println(dateTime); // 2023-01-04T19:52:33.130368400+09:00[Asia/Tokyo]

変換の結果としてタイムゾーンの情報が不要であれば LocalDateTime も使えます。

final var now = Instant.now();
System.out.println(now); // 2023-01-04T10:52:33.146357300Z

// 日本標準時の "JST" という名前からも取得できます。
final var zoneId = ZoneId.of("JST", ZoneId.SHORT_IDS);
System.out.println(zoneId); // Asia/Tokyo

// UTCから+9時間された時刻になります。
final var dateTime = LocalDateTime.ofInstant(now, zoneId);
System.out.println(dateTime); // 2023-01-04T19:52:33.146357300

まとめ

  • 現在時刻の取得には、Java 8 で追加された Instant.now や ZonedDateTime.now などを使いましょう。
  • 古い API である Calendar や Date はおすすめしません。

関連記事

ページの先頭へ