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

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

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


簡単なまとめ

※デフォルトのタイムゾーンが "Asia/Tokyo" の環境で実行しています。

Java 8以降 (おすすめ)

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

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

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

// 日本標準時より -9 時間となります。
System.out.println(now); // 2021-12-04T07:50:00.699106500Z
ZonedDateTime ZonedDateTime now()

デフォルトのタイムゾーンを使い、現在時刻のZonedDateTimeを返します。
// 日本時間の 2021/12/04 16:50:00 くらいに実行した例です。
final var now = ZonedDateTime.now();
System.out.println(now); // 2021-12-04T16:50:00.699106500+09:00[Asia/Tokyo]
LocalDateTime LocalDateTime now()

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

※LocalDateTime自身はタイムゾーンを持ちません。
// 日本時間の 2021/12/04 16:50:00 くらいに実行した例です。
final var now = LocalDateTime.now();
System.out.println(now); // 2021-12-04T16:50:00.699106500

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

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

Java 8より前のバージョン

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

UTC 1970-01-01 00:00からの経過ミリ秒を返します。
// 日本時間の 2021/12/04 16:50:00 くらいに実行した例です。
final var now = System.currentTimeMillis();
System.out.println(now); // 1638604200699
Calendar Calendar getInstance()

デフォルトのタイムゾーンおよびロケールを使用して、現在日時のCalendarを取得します。
// 日本時間の 2021/12/04 16:50:00 くらいに実行した例です。
final var now = Calendar.getInstance();
System.out.println(now.getTime()); // Sat Dec 04 16:50:00 JST 2021
Date Date()

現在時刻でDateを作成します。
// 日本時間の 2021/12/04 16:50:00 くらいに実行した例です。
final var now = new Date();
System.out.println(now); // Sat Dec 04 16:50:00 JST 2021

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 から追加された "時点" を表すクラスです。
ナノ秒の精度で現在時刻を取得できます。

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

final var now = Instant.now();

// UTC
System.out.println(now); // 2021-12-04T08:03:16.451657400Z

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

// ミリ秒の部分を取得
System.out.println(now.getNano()); // 451657400

// 日本標準時に変換(UTCに比べて+9時間)
final var jst = ZonedDateTime.ofInstant(now, ZoneId.systemDefault());
System.out.println(jst); // 2021-12-04T17:03:16.451657400+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); // 2021-12-04T17:05:13.464766200+09:00[Asia/Tokyo]

// UTC時間で表示。(日本標準時より-9時間となります)
System.out.println(now.toInstant()); // 2021-12-04T08:05:13.464766200Z

LocalDateTime.now

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

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

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

final var now = LocalDateTime.now();

// 日本標準時 (ただしタイムゾーンなし)
System.out.println(now); // 2021-12-04T17:09:14.906489500

LocalDate.now、LocalTime.nowも同様となります。

final LocalDate now = LocalDate.now();

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

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

System.currentTimeMillis

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

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

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

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

final var now = Instant.ofEpochMilli(millis);

// UTC
System.out.println(now); // 2021-12-04T08:11:21.019Z

// 日本標準時に変換(UTCに比べて+9時間)
final var jst = ZonedDateTime.ofInstant(now, ZoneId.systemDefault());
System.out.println(jst); // 2021-12-04T17:11:21.019+09:00[Asia/Tokyo]

メモ

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

UTCから"Asia/Tokyo"タイムゾーンに変換

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

final var now = Instant.now();
System.out.println(now); // 2021-12-04T08:14:48.752402300Z

// UTCから+9時間された時刻になります。
final var jst = ZonedDateTime.ofInstant(now, ZoneId.of("Asia/Tokyo"));
System.out.println(jst); // 2021-12-04T17:14:48.752402300+09:00[Asia/Tokyo]

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

final var now = Instant.now();
System.out.println(now); // 2021-12-04T08:14:48.755400Z

// UTCから+9時間された時刻になります。
final var jst = LocalDateTime.ofInstant(now, ZoneId.of("Asia/Tokyo"));
System.out.println(jst); // 2021-12-04T17:14:48.755400

まとめ

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

関連記事

ページの先頭へ