Java LocalDate クラス

LocalDate は Java 8 で導入された不変の日付クラスであり、java.timeパッケージの一部です。

LocalDate はタイムゾーンを含まない日付(年-月-日)を表します。例: "2023-05-15"。LocalDate は時刻やタイムゾーンの情報を含まないため、誕生日や祝日など日付のみが必要な場面に最適です。


LocalDate の主な特徴

1. 不変性

LocalDate インスタンスは不変であり、変更操作を行うと常に新しい LocalDate オブジェクトが返され、元のオブジェクトは変更されません。

2. スレッドセーフ

不変性により、LocalDate はスレッドセーフであり、マルチスレッド環境で安全に使用できます。

3. ISO-8601 規格

LocalDate は ISO-8601 暦法に準拠しています。これは現代の日付と時刻表現の国際標準です。


LocalDate オブジェクトの作成

1. 現在の日付を取得

LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);

2. 特定の日付を指定して作成

LocalDate specificDate = LocalDate.of(2023, Month.MAY, 15);
// 或者
LocalDate specificDate2 = LocalDate.of(2023, 5, 15);

3. 文字列から解析

LocalDate parsedDate = LocalDate.parse("2023-05-15");

よく使う操作メソッド

1. 日付情報の取得

例

LocalDate date = LocalDate.of(2023, 5, 15);
int year = date.getYear();        // 2023
Month month = date.getMonth();    // MAY
int day = date.getDayOfMonth();   // 15
DayOfWeek dow = date.getDayOfWeek(); // MONDAY
int len = date.lengthOfMonth();   // 31 (5月の日数)
boolean leap = date.isLeapYear(); // false (2023年はうるう年ではない)

2. 日付の加算・減算

例

LocalDate tomorrow = today.plusDays(1);
LocalDate nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);

3. 日付の比較

例

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 6, 20);

boolean isBefore = date1.isBefore(date2); // true
boolean isAfter = date1.isAfter(date2);   // false
boolean isEqual = date1.isEqual(date2);   // false

4. 日付の調整

例

LocalDate date = LocalDate.of(2023, 5, 15);
LocalDate firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());

フォーマットと解析

1. 日付のフォーマット

例

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);

2. 文字列を日付に解析

例

String dateStr = "2023/05/15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse(dateStr, formatter);

実際の応用例

1. 2つの日付間の日数を計算

例

LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("日数差: " + daysBetween);

2. 日付が範囲内かどうかを確認

例

LocalDate dateToCheck = LocalDate.of(2023, 5, 10);
LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 31);
if (dateToCheck.isAfter(startDate) && dateToCheck.isBefore(endDate)) {
    System.out.println("日付は範囲内です");
}

3. ある月のすべての日付を取得

例

LocalDate date = LocalDate.of(2023, 5, 1);
int daysInMonth = date.lengthOfMonth();

for (int i = 1; i <= daysInMonth; i++) {
    System.out.println(date.withDayOfMonth(i));
}

総合例

例

import java.time.LocalDate;
import java.time.Month;
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class LocalDateDemo {

    public static void main(String[] args) {
        // 1. LocalDate インスタンスの作成
        System.out.println("=== LocalDate インスタンスの作成 ===");
        LocalDate today = LocalDate.now();
        LocalDate specificDate = LocalDate.of(2023, Month.JULY, 15);
        LocalDate parsedDate = LocalDate.parse("2023-08-20");
       
        System.out.println(現在の日付: + today);
        System.out.println("特定の日付: " + specificDate);
        System.out.println("解析した日付: " + parsedDate);

        // 2. 日付情報の取得
        System.out.println("\n"=== 日付情報の取得 ===");
        System.out.println("年: " + today.getYear());
        System.out.println("月: " + today.getMonth() + " (" + today.getMonthValue() + ")");
        System.out.println("日: " + today.getDayOfMonth());
        System.out.println("曜日: " + today.getDayOfWeek());
        System.out.println("年内の何日目: " + today.getDayOfYear());
        System.out.println("月の日数: " + today.lengthOfMonth());
        System.out.println("年の日数: " + today.lengthOfYear());
        System.out.println("うるう年かどうか: " + today.isLeapYear());

        // 3. 日付計算
        System.out.println("\n"=== 日付計算 ===");
        System.out.println("5日加算: " + today.plusDays(5));
        System.out.println("2週間加算: " + today.plusWeeks(2));
        System.out.println("3か月加算: " + today.plusMonths(3));
        System.out.println("1年減算: " + today.minusYears(1));
       
        System.out.println("翌月の1日: " + today.plusMonths(1).withDayOfMonth(1));
        System.out.println("今月の最終日: " + today.withDayOfMonth(today.lengthOfMonth()));

        // 4. 日付の比較
        System.out.println("\n"=== 日付の比較 ===");
        LocalDate date1 = LocalDate.of(2023, 6, 15);
        LocalDate date2 = LocalDate.of(2023, 6, 20);
       
        System.out.println(date1 + " は " + date2 + " より前? " + date1.isBefore(date2));
        System.out.println(date1 + " は " + date2 + " より後? " + date1.isAfter(date2));
        System.out.println(date1 + " と等しい " + date2 + "? " + date1.isEqual(date2));
       
        // 5. 日付差の計算
        System.out.println("\n"=== 日付差の計算 ===");
        LocalDate startDate = LocalDate.of(2023, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 12, 31);
       
        System.out.println("2つの日付間の日数: " + ChronoUnit.DAYS.between(startDate, endDate));
        System.out.println("2つの日付間の月数: " + ChronoUnit.MONTHS.between(startDate, endDate));
        System.out.println("2つの日付間の年数: " + ChronoUnit.YEARS.between(startDate, endDate));

        // 6. 日付のフォーマット
        System.out.println("\n"=== 日付のフォーマット ===");
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE", Locale.CHINA);
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
       
        System.out.println("基本フォーマット: " + today.format(basicFormatter));
        System.out.println("中国語フォーマット: " + today.format(chineseFormatter));
        System.out.println("英語フォーマット: " + today.format(customFormatter));

        // 7. その他の便利なメソッド
        System.out.println("\n"=== その他の便利なメソッド ===");
        System.out.println("次の月曜日に調整: " + today.with(DayOfWeek.MONDAY));
        System.out.println("週末かどうか: " +
            (today.getDayOfWeek() == DayOfWeek.SATURDAY || today.getDayOfWeek() == DayOfWeek.SUNDAY));
       
        // 8. 日付範囲の反復
        System.out.println("\n"=== 日付範囲の反復 ===");
        System.out.println("次の7日間の日付: ");
        today.datesUntil(today.plusDays(7))
             .forEach(System.out::println);
    }
}

出力結果は次のようになります。

=== 创建 LocalDate 实例 ===
当前日期: 2023-06-15
特定日期: 2023-07-15
解析日期: 2023-08-20

=== 获取日期信息 ===
年: 2023
月: JUNE (6)
日: 15
星期: THURSDAY
一年中的第几天: 166
月份天数: 30
年份天数: 365
是否闰年: false

=== 日期计算 ===
加5天: 2023-06-20
加2周: 2023-06-29
加3个月: 2023-09-15
减1年: 2022-06-15
下个月的第一天: 2023-07-01
本月的最后一天: 2023-06-30

=== 日期比较 ===
2023-06-15 在 2023-06-20 之前? true
2023-06-15 在 2023-06-20 之后? false
2023-06-15 等于 2023-06-20? false

=== 计算日期差 ===
两个日期之间的天数: 364
两个日期之间的月数: 11
两个日期之间的年数: 0

=== 日期格式化 ===
基本格式: 2023/06/15
中文格式: 2023年06月15日 星期四
英文格式: Jun 15, 2023

=== 其他实用方法 ===
调整到下个星期一: 2023-06-19
是否是周末: false

=== 日期范围迭代 ===
接下来7天的日期:
2023-06-15
2023-06-16
2023-06-17
2023-06-18
2023-06-19
2023-06-20
2023-06-21

まとめ

LocalDate クラスは Java 8 の日時 API の重要な構成要素であり、日付関連の操作を処理するための豊富なメソッドを提供します。従来の Date クラスや Calendar クラスと比較して、LocalDate はより直感的で使いやすく、スレッドセーフです。LocalDate の使い方をマスターすることで、日付処理の効率とコードの可読性を大幅に向上させることができます。

以下はそのよく使うメソッドです:

静的ファクトリメソッド

メソッド 説明 例
static LocalDate now() 現在の日付を取得 LocalDate.now()
static LocalDate of(int year, int month, int dayOfMonth) 年・月・日を指定して作成 LocalDate.of(2023, 6, 15)
static LocalDate of(int year, Month month, int dayOfMonth) 年・月・日を指定して作成(Month 列挙型を使用) LocalDate.of(2023, Month.JUNE, 15)
static LocalDate parse(CharSequence text) 文字列から解析(ISO形式:yyyy-MM-dd) LocalDate.parse("2023-06-15")
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) 指定した形式で解析 LocalDate.parse("15/06/2023", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

日付情報の取得

メソッド 説明 例
int getYear() 年を取得 2023
Month getMonth() 月を取得(Month 列挙型) Month.JUNE
int getMonthValue() 月の値(1-12)を取得 6
int getDayOfMonth() 月内の日を取得 15
int getDayOfYear() 年内の日を取得 166
DayOfWeek getDayOfWeek() 曜日を取得(DayOfWeek 列挙型) DayOfWeek.THURSDAY
int lengthOfMonth() 月の日数を返す 30
int lengthOfYear() 年の日数を返す(365または366) 365
boolean isLeapYear() うるう年かどうかを判定 false

日付操作

メソッド 説明 例
LocalDate plusDays(long days) 日数を加算 date.plusDays(5)
LocalDate plusWeeks(long weeks) 週数を加算 date.plusWeeks(2)
LocalDate plusMonths(long months) 月数を加算 date.plusMonths(3)
LocalDate plusYears(long years) 年数を加算 date.plusYears(1)
LocalDate minusDays(long days) 日数を減算 date.minusDays(5)
LocalDate minusWeeks(long weeks) 週数を減算 date.minusWeeks(2)
LocalDate minusMonths(long months) 月数を減算 date.minusMonths(3)
LocalDate minusYears(long years) 年数を減算 date.minusYears(1)
LocalDate withDayOfMonth(int dayOfMonth) 月内の日を変更 date.withDayOfMonth(1)
LocalDate withDayOfYear(int dayOfYear) 年内の日を変更 date.withDayOfYear(100)
LocalDate withMonth(int month) 月を変更 date.withMonth(12)
LocalDate withYear(int year) 年を変更 date.withYear(2024)

日付の比較

メソッド 説明 例
boolean isAfter(ChronoLocalDate other) 指定した日付より後かどうか date1.isAfter(date2)
boolean isBefore(ChronoLocalDate other) 指定した日付より前かどうか date1.isBefore(date2)
boolean isEqual(ChronoLocalDate other) 指定した日付と等しいかどうか date1.isEqual(date2)
long until(ChronoLocalDate endDate, ChronoUnit unit) 2つの日付間の時間量を計算 date1.until(date2, ChronoUnit.DAYS)

フォーマットと変換

メソッド 説明 例
String format(DateTimeFormatter formatter) 文字列にフォーマット date.format(DateTimeFormatter.ISO_DATE)
String toString() ISO形式の文字列(yyyy-MM-dd)に変換 "2023-06-15"
long toEpochDay() 1970-01-01からの日数に変換 19531
LocalDateTime atTime(int hour, int minute) LocalDateTime に変換 date.atTime(14, 30)
LocalDateTime atTime(LocalTime time) LocalDateTimeへの変換 date.atTime(LocalTime.now())

その他の便利なメソッド

メソッド 説明 例
boolean isSupported(ChronoUnit unit) 時間単位がサポートされているか確認 date.isSupported(ChronoUnit.DAYS)
boolean isSupported(ChronoField field) 時間フィールドがサポートされているか確認 date.isSupported(ChronoField.HOUR_OF_DAY)
LocalDate with(TemporalAdjuster adjuster) アジャスターを使用して日付を調整 date.with(TemporalAdjusters.firstDayOfMonth())

Java java.nio.file.Files

その他の拡張