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時間の時差があります。 |
|
ZonedDateTime | ZonedDateTime now() デフォルトのタイムゾーンを使い、現在時刻の ZonedDateTime を返します。 |
|
LocalDateTime | LocalDateTime now() デフォルトのタイムゾーンを使い、現在時刻の LocalDateTime を返します。 ※LocalDateTime自身はタイムゾーンを持ちません。 |
|
Java 8 以降を使っている場合は、これらのAPIを使うことをおすすめします。
Instant や ZonedDateTime, LocalDateTime, タイムゾーンについては「日付・時刻の基本」の記事でも解説しています。
よろしければそちらもご参照いただけたら幸いです。
Java 8より前のバージョン
クラス | メソッド | 使用例 |
---|---|---|
System | long currentTimeMillis() UTC 1970-01-01 00:00 からの経過ミリ秒を返します。 |
|
Calendar | Calendar getInstance() デフォルトのタイムゾーンおよびロケールを使用して、現在時刻の Calendar を取得します。 |
|
Date | Date() 現在時刻で Date を作成します。 |
|
Calendar と Date はすでに古いAPIです。
もし Java 8 以降を使っている場合、代わりとなる新しいAPIが java.time パッケージ にあるのでそちらを使いましょう。
本記事でも、Calendar と Date の解説は割愛させていただきます。
関連記事:Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう
System.currentTimeMillis については、Instant の簡易版的には使ってもよいかなと思います。
Instant.now
public static Instant now()
システム・クロックから現在のインスタントを取得します。
Instant は Java 8 から追加された "時点" を表すクラスです。
ナノ秒の精度で現在時刻を取得できます。
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
LocalDate、LocalTime も同じように 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
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を基準としています。
もし日本標準時に変換したい場合は ZonedDateTime か LocalDateTime を使います。
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);
// 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 はおすすめしません。
関連記事
- 日付・時刻の基本
- Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう
- 文字列と日付・時刻の変換
- 日時と曜日の計算
- 現在の曜日(DayOfWeek)を取得
- ZoneIdとZoneOffsetの違い
- API 使用例
- DateTimeException (日付・時刻の例外)
- DateTimeParseException (日付・時刻の解析例外)
- DayOfWeek (曜日)
- Duration (時間の量)
- LocalDate (日付・タイムゾーンなし)
- LocalDateTime (日時・タイムゾーンなし)
- LocalTime (時刻・タイムゾーンなし)
- Month (月)
- Instant (時点)
- OffsetDateTime (日時・オフセットあり)
- OffsetTime (時刻・オフセットあり)
- Period (日付の量)
- TemporalAdjusters (日時の調整ユーティリティ)
- Year (年)
- ZonedDateTime (日時・タイムゾーンあり)
- ZoneId (タイムゾーンID)
- ZoneOffset (タイムゾーン・オフセット)