【Java】日付操作はjava.timeで!

Javaで日付や時間を扱う機会は非常に多いですが、誤ったAPIを使ってバグや非効率なコードに悩まされた経験はありませんか?
この記事では、Java 8で導入された java.time パッケージの重要性と使い方を、現役エンジニアの視点から解説します。
もう古い DateCalendar には戻れなくなるかもしれません。

目次

なぜ日時操作は難しいのか?

日時操作は、プログラミングの中でも意外とトラブルが多い領域です。

  • 月の境界やうるう年、タイムゾーンの扱い
  • 日付の加算・減算による意図しない挙動
  • スレッドセーフでないAPIによるバグ

従来の java.util.DateCalendar には多くの欠点があり、複雑なコードを要求されていました。
そこでJava 8以降、新しい日時APIとして java.time パッケージが導入されました。

java.time パッケージとは?

java.time は、Joda-Time から着想を得て設計された、モダンな日時APIです。Java 8以降で標準搭載され、以下のような特徴があります。

  • 不変(immutable)かつスレッドセーフ
  • 明確で直感的なクラス構成
  • フォーマットや差分計算も簡単

代表的なクラス:

クラス名説明
LocalDate年月日(時間なし)
LocalTime時刻(年月日なし)
LocalDateTime年月日+時刻
ZonedDateTimeタイムゾーン付き日時
Duration, Period時間や日数の差分
DateTimeFormatterフォーマットやパース処理

なぜ java.time を使うべきか?

従来の DateCalendar を使うと、以下のような課題がありました。

🔴 従来の問題点

Date date = new Date();
date.setMonth(12); // 実際は1月になる(0始まり)
  • 月が0始まりで直感に反する
  • 可変オブジェクトでスレッドセーフでない
  • APIが冗長で複雑

🟢 java.time のメリット

LocalDate date = LocalDate.of(2025, 1, 1); // 明快でバグが起きにくい
LocalDate nextWeek = date.plusWeeks(1);   // 操作も直感的

開発現場でも、java.time に切り替えたことでバグの発生が激減し、コードの可読性が向上したという声が多く聞かれます。

よく使うjava.timeのクラスと使い方

LocalDate:日付の操作

LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);

LocalDateTime:日時(日付+時刻)

LocalDateTime now = LocalDateTime.now();
LocalDateTime meeting = now.plusHours(3);

ZonedDateTime:タイムゾーンを考慮した日時

ZonedDateTime tokyoNow = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

Duration / Period:差分の計算

Period period = Period.between(LocalDate.of(2024,1,1), LocalDate.of(2025,1,1));
Duration duration = Duration.between(LocalTime.of(9, 0), LocalTime.of(17, 0));

DateTimeFormatter:フォーマット・パース

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formatted = LocalDate.now().format(formatter);
LocalDate parsed = LocalDate.parse("2025/05/21", formatter);

Date, Calendar からの移行方法

既存のコードが DateCalendar を使っている場合も、java.time との互換は比較的簡単です。

DateInstantLocalDateTime の変換

Date oldDate = new Date();
Instant instant = oldDate.toInstant();
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

LocalDateTimeDate の変換

LocalDateTime newDate = LocalDateTime.now();
Date converted = Date.from(newDate.atZone(ZoneId.systemDefault()).toInstant());

まとめ:今後のJava開発ではjava.timeが常識

  • Javaの日時操作は 必ず java.time を使うべき
  • コードの安全性と可読性が大きく向上
  • 古い Date, Calendar はメンテナンス性に劣る

現場での経験から言えば、チーム内で java.time を統一して使うだけで、バグや混乱が大幅に減ると断言できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次