カテゴリ: Javaの例外処理 更新日: 2026/06/08

JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド

371
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い

先生と生徒の会話形式で理解しよう

生徒

「Javaで日付や時間を扱うときって、DateクラスとかCalendarクラスとか、いろいろあって混乱します……。結局どれを使えばいいんですか?」

先生

「たしかにJavaには複数の日付・時間APIがありますね。DateCalendarは古い日付クラス、新しいものはJava 8で導入されたjava.timeパッケージのクラスです。」

生徒

「それぞれ何が違って、どっちを使えば良いのか分からないです……。」

先生

「それでは、JavaのDateCalendarと、新しいLocalDateLocalDateTimeの違いを詳しく解説していきましょう!」

1. Javaの日付・時間APIは2種類ある

1. Javaの日付・時間APIは2種類ある
1. Javaの日付・時間APIは2種類ある

Javaでは、日付や時間を扱うために次の2種類のAPIがあります。

  • 旧API:java.util.Datejava.util.Calendarjava.text.SimpleDateFormatなど
  • 新API:java.time.LocalDateLocalDateTimeZonedDateTimeDateTimeFormatterなど

旧APIはJava初期から存在しますが、設計に問題が多く、保守性や可読性に欠けていました。そのため、Java 8で新しい日付・時間APIが導入され、今では新APIの使用が推奨されています。

2. DateとCalendarの主な問題点

2. DateとCalendarの主な問題点
2. DateとCalendarの主な問題点

Javaの旧APIであるDateCalendarには、以下のような問題があります。

  • 可読性が低い:使い方が直感的でなく、コードが分かりにくくなる
  • 不変ではない:インスタンスの内容が変更可能なため、バグの温床になる
  • 月が0始まり:Calendarでは1月が0、12月が11という仕様で混乱しやすい
  • スレッドセーフでない:SimpleDateFormatなどはマルチスレッドで正しく動作しない

3. 新しい日付API(java.timeパッケージ)の特徴

3. 新しい日付API(java.timeパッケージ)の特徴
3. 新しい日付API(java.timeパッケージ)の特徴

Java 8から導入されたjava.timeパッケージは、旧APIの課題を解決するモダンな日付・時間APIです。以下のような利点があります。

  • 不変(Immutable):インスタンスが変更不可で安全
  • 明確な設計:LocalDate(日付)、LocalTime(時間)、LocalDateTime(日付+時間)など役割が分かれている
  • 日時の比較や加算が簡単:plusDays()isBefore()など便利なメソッドが揃っている
  • スレッドセーフ:マルチスレッド環境でも安心して使用可能
  • タイムゾーン対応:ZonedDateTimeでタイムゾーンを意識した日時が扱える

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. DateとLocalDateの比較:基本の使い方

4. DateとLocalDateの比較:基本の使い方
4. DateとLocalDateの比較:基本の使い方

旧APIのDateと、新APIのLocalDateを比較してみましょう。

旧API(Date)を使う例:


import java.util.Date;

public class OldDateExample {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println("現在日時(Date): " + now);
    }
}

新API(LocalDate)を使う例:


import java.time.LocalDate;

public class NewDateExample {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今日の日付(LocalDate): " + today);
    }
}

5. LocalDateTimeで日時を扱う方法

5. LocalDateTimeで日時を扱う方法
5. LocalDateTimeで日時を扱う方法

LocalDateTimeを使えば、日付と時間の両方を簡単に扱えます。


import java.time.LocalDateTime;

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("現在日時(LocalDateTime): " + now);
    }
}

このように新しい日付APIを使えば、コードがシンプルでわかりやすくなります。

6. 書式設定の違い:SimpleDateFormat vs DateTimeFormatter

6. 書式設定の違い:SimpleDateFormat vs DateTimeFormatter
6. 書式設定の違い:SimpleDateFormat vs DateTimeFormatter

SimpleDateFormatは旧APIの代表的なフォーマッタですが、スレッドセーフでない欠点があります。

旧API:


import java.text.SimpleDateFormat;
import java.util.Date;

public class OldFormatExample {
    public static void main(String[] args) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
        String formatted = formatter.format(new Date());
        System.out.println("フォーマット結果(旧API): " + formatted);
    }
}

新API:


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class NewFormatExample {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        String formatted = today.format(formatter);
        System.out.println("フォーマット結果(新API): " + formatted);
    }
}

7. よく使う新しい日付クラスまとめ

7. よく使う新しい日付クラスまとめ
7. よく使う新しい日付クラスまとめ

以下はJavaの新しい日付・時間APIでよく使う代表的なクラスです。

  • LocalDate:日付のみ
  • LocalTime:時間のみ
  • LocalDateTime:日付+時間
  • ZonedDateTime:タイムゾーン付きの日時
  • Instant:UTC(協定世界時)での瞬間
  • PeriodDuration:期間や時間の長さを扱う

8. DateやCalendarは使ってはいけないの?

8. DateやCalendarは使ってはいけないの?
8. DateやCalendarは使ってはいけないの?

DateCalendarは古いライブラリと連携するときや、どうしても必要なときには使いますが、基本的にはjava.timeパッケージを優先しましょう。今後の開発では新APIが標準です。

どうしてもDateLocalDateの変換が必要なときは、java.sqlInstant経由で変換可能です。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaで日付を扱う際、DateクラスとCalendarクラス、新しい日付APIのどれを使うのが正解ですか?

現在のJava開発においては、Java 8で導入された「新しい日付API(java.timeパッケージ)」を使用するのが標準であり、正解です。具体的にはLocalDate、LocalTime、LocalDateTimeといったクラスを優先して使用してください。古いAPIであるjava.util.Dateやjava.util.Calendarは、設計上の問題が多く、現在は非推奨に近い扱いとなっています。特別な理由(古いライブラリとの互換性維持など)がない限り、新APIを選択することで、バグの少ない読みやすいコードを書くことができます。
Javaの例外処理の一覧へ
新着記事
Java
Javaの演算子の優先順位
Javaの演算子の優先順位を完全解説!初心者向けの丁寧な解説
Java
Javaのローカル変数と順次処理
Javaのローカル変数と順次処理を徹底解説!初心者でも理解できるコードの基本
Python
NumPyのdtype一覧!int・float・bool・str・objectの違いを比較
NumPyのdtype一覧を完全解説!int・float・bool・str・objectの違いを初心者向けに比較
Dart
Dartのコンストラクタまとめ!デフォルト・名前付きコンストラクタの使い方
Dartのコンストラクタまとめ完全ガイド!デフォルトコンストラクタと名前付きコンストラクタの使い方を初心者向けに解説
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク