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

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の例外処理の一覧へ
新着記事
Java
Java の toString() メソッドをオーバーライドしてオブジェクトの情報を表示
Java の toString() メソッドをオーバーライドしてオブジェクトの情報を表示
Java
Java のオブジェクトを比較する方法(equals() と == の違い)
Java のオブジェクトを比較する方法(equals() と == の違い)初心者でもわかる使い分けの基本
Java
JDBC の Statement を使って SQL を実行する(SELECT 文)
JavaのJDBCでStatementを使ってSELECT文を実行する方法を徹底解説!初心者向けデータベース接続入門
Java
Java の static フィールドと static メソッド(クラス全体で共有する)
Java の static フィールドと static メソッド(クラス全体で共有する)
人気記事
AWS
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
AWS
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
AWS
インスタンスタイプの料金比較と最適な選び方(最新2026年版)
AWSインスタンスタイプの料金比較と最適な選び方!初心者でもわかる2025年最新ガイド
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク