【初心者脱却】Javaで日付操作を極める|LocalDate/Date/Calendarの違いと使い分け

Javaで日付を扱う場面は非常に多く、業務システムやWebアプリ開発でも頻出です。しかし、Javaでは複数の「日付クラス」が存在するため、どれを使えば良いか迷うことも。この記事では、LocalDateDateCalendarの違いと使い分け方を徹底解説し、初心者を脱却できる実践的な知識を身につけましょう。


結論:これからは LocalDate / LocalDateTime を基本に使おう!

Java 8以降で日付操作を行うなら、java.timeパッケージ(LocalDate, LocalDateTime など)を中心に使うのがベストです。

クラス名特徴推奨度
LocalDate / LocalDateTimeJava 8以降の新API。スレッドセーフ・シンプル・拡張性あり。★★★★★(推奨)
Date古いAPI。ミリ秒単位の日時管理。操作が煩雑。★★☆☆☆(非推奨)
CalendarDateの補助的役割。柔軟性はあるが複雑。★★☆☆☆(非推奨)

1. LocalDate / LocalDateTime とは?

▶ 特徴

  • Java 8で導入された新しい日付API(java.timeパッケージ)
  • スレッドセーフでバグが起きにくい
  • 時刻情報が欲しいときは LocalDateTimeZonedDateTime を使う

▶ サンプルコード

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

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

        LocalDateTime now = LocalDateTime.now();
        System.out.println("現在日時: " + now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
    }
}

2. Date クラスとは?

▶ 特徴

  • Javaの初期から存在するクラス(非推奨)
  • 時刻は持っているが、操作が非常に直感的でない
  • SimpleDateFormat と組み合わせることで文字列化できる

▶ サンプルコード

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

public class Main {
    public static void main(String[] args) {
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println("現在日時: " + sdf.format(now));
    }
}

3. Calendar クラスとは?

▶ 特徴

  • Date を補完するために導入されたクラス
  • 月が0始まり(1月は0、12月は11)という仕様が罠になりやすい
  • 日付の加算・減算には便利

▶ サンプルコード

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, 3); // 3日後
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        System.out.println("3日後の日付: " + sdf.format(cal.getTime()));
    }
}

どれを使えばいいの?【使い分けまとめ】

シーン使用すべきクラス
最新のコード、新規開発LocalDate / LocalDateTime
レガシーコードの保守Date または Calendar
タイムゾーンを扱いたいZonedDateTime
ユニットテストで固定日時を使いたいClock を利用(LocalDate.now(Clock)

便利Tips|日付の加算・減算(LocalDate)

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusDays(7);
LocalDate lastMonth = today.minusMonths(1);

System.out.println("1週間後: " + nextWeek);
System.out.println("1か月前: " + lastMonth);

補足|LocalDateとLocalDateTimeの違い

クラス名何が入っている?
LocalDate年・月・日(00:00:00固定)
LocalDateTime年・月・日・時・分・秒

まとめ

  • Java 8以降は LocalDate / LocalDateTime を標準に使おう
  • レガシーAPI(DateCalendar)はなるべく避ける
  • 必要に応じて ZonedDateTimeClock を活用する
タイトルとURLをコピーしました