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年はうるう年ではない)
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);
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
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());
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);
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);
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);
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("日付は範囲内です");
}
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));
}
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);
}
}
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()) |