Java Tips | 日付・時間:曜日取得

Java Java
スポンサーリンク

曜日取得のゴールイメージ

「2025-03-26 は何曜日?」「この日付が土日かどうか知りたい」
業務システムだと、営業日判定・カレンダー表示・締切日のチェックなどで“曜日”は頻出です。

ここでやってはいけないのは、自前で「ツェラーの公式」みたいな計算を実装することです。
Java には、日付から曜日を安全に取り出すための仕組み(DayOfWeek が用意されています。

まずは「日付 → 曜日(列挙型)」、
必要なら「曜日 → 表示用文字列(日本語など)」という二段構えで考えましょう。


LocalDate から曜日を取り出す基本

getDayOfWeek() で DayOfWeek を取得する

一番基本のパターンです。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DayOfWeekBasic {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 3, 26); // 例: 2025-03-26

        DayOfWeek dow = date.getDayOfWeek();

        System.out.println("日付   : " + date); // 2025-03-26
        System.out.println("曜日   : " + dow);  // WEDNESDAY
        System.out.println("数値(1〜7): " + dow.getValue()); // 3
    }
}
Java

ここで重要なのは、DayOfWeek が列挙型(enum)であることです。

MONDAYSUNDAY まで 7 つの定数を持ち、
getValue() は「月曜=1 … 日曜=7」という数値を返します。

ポイントは二つあります。

ひとつは、「曜日を“意味のある型”として扱える」こと。
単なる intString ではなく DayOfWeek なので、
メソッドの引数や戻り値に使うとコードの意図がはっきりします。

もうひとつは、「日付→曜日の計算は全部 Java に任せられる」こと。
うるう年や世紀のまたぎなどを一切気にしなくてよい、というのは大きな安心材料です。


曜日を日本語で表示する

シンプルに switch でマッピングする

画面や帳票では「水曜日」「水」など、日本語で出したいことが多いです。
最初はシンプルに switch でマッピングしてしまって構いません。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DayOfWeekJapanese {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 3, 26);
        DayOfWeek dow = date.getDayOfWeek();

        String jp = toJapanese(dow);

        System.out.println("日付 : " + date); // 2025-03-26
        System.out.println("曜日 : " + jp);   // 水
    }

    private static String toJapanese(DayOfWeek dow) {
        return switch (dow) {
            case MONDAY    -> "月";
            case TUESDAY   -> "火";
            case WEDNESDAY -> "水";
            case THURSDAY  -> "木";
            case FRIDAY    -> "金";
            case SATURDAY  -> "土";
            case SUNDAY    -> "日";
        };
    }
}
Java

ここでのポイントは、
「内部では DayOfWeek を使い、表示の直前だけ文字列に変換する」という設計です。

ロジックの中では DayOfWeek のまま扱った方が、
「土日かどうか」「平日かどうか」などの判定が書きやすくなります。


曜日を使った判定(平日/土日)

isWeekend/isWeekday のようなユーティリティを作る

業務では「土日は休み」「平日のみ営業」などの判定がよく出てきます。
DayOfWeek を使うと、こういうユーティリティが簡単に書けます。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class WeekendCheck {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 3, 29); // 例: 土曜日
        DayOfWeek dow = date.getDayOfWeek();

        System.out.println("日付 : " + date);
        System.out.println("曜日 : " + dow);
        System.out.println("土日?: " + isWeekend(dow)); // true
    }

    private static boolean isWeekend(DayOfWeek dow) {
        return dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY;
    }
}
Java

ここで大事なのは、
「曜日判定のロジックを一か所に閉じ込める」ことです。

あちこちで == SATURDAY || == SUNDAY と書き始めると、
「祝日も休みにしたい」「土曜は午前だけ営業」などの仕様変更に弱くなります。

isBusinessDay(LocalDate date) のようなメソッドを用意して、
中で DayOfWeek と祝日マスタを見て判定する、という設計にすると、
業務ロジックがきれいにまとまります。


DateTimeFormatter で曜日を文字列としてフォーマットする

曜日を含むフォーマットパターン(EEEE など)

DateTimeFormatter を使うと、
日付と一緒に曜日名を文字列として出力することもできます。

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

public class DayOfWeekFormat {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 3, 26);

        DateTimeFormatter fmt =
                DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)", Locale.JAPAN);

        String text = date.format(fmt);
        System.out.println(text); // 2025年03月26日(水)
    }
}
Java

(E) の部分が「短い曜日名」を表します。
(EEEE) とすると「水曜日」のようなフル表記になります。

ここでの重要ポイントは、
「ロケール(Locale)によって曜日名の言語が変わる」ことです。

Locale.JAPAN なら日本語、Locale.US なら英語、というように、
多言語対応が必要なシステムでは Locale を意識した設計が重要になります。


LocalDateTime / ZonedDateTime からの曜日取得

LocalDateTime でも getDayOfWeek() は同じ

LocalDateTimegetDayOfWeek() を持っています。

import java.time.DayOfWeek;
import java.time.LocalDateTime;

public class LocalDateTimeDayOfWeek {

    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 3, 26, 15, 30);

        DayOfWeek dow = dt.getDayOfWeek();

        System.out.println("日時 : " + dt);  // 2025-03-26T15:30
        System.out.println("曜日 : " + dow); // WEDNESDAY
    }
}
Java

「日時」から曜日を知りたいときも、
「日付部分に対して曜日を計算する」というイメージで OK です。

ZonedDateTime の場合(タイムゾーンを考慮)

ZonedDateTime でも同様に getDayOfWeek() が使えますが、
ここではタイムゾーンが効いてきます。

import java.time.DayOfWeek;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZonedDateTimeDayOfWeek {

    public static void main(String[] args) {
        ZonedDateTime zdtTokyo = ZonedDateTime.of(
                2025, 3, 26,
                1, 0, 0, 0,
                ZoneId.of("Asia/Tokyo")
        );

        ZonedDateTime zdtUtc = zdtTokyo.withZoneSameInstant(ZoneId.of("UTC"));

        DayOfWeek dowTokyo = zdtTokyo.getDayOfWeek();
        DayOfWeek dowUtc   = zdtUtc.getDayOfWeek();

        System.out.println("東京時間 : " + zdtTokyo + " / " + dowTokyo);
        System.out.println("UTC時間 : " + zdtUtc   + " / " + dowUtc);
    }
}
Java

タイムゾーンが変わると「日付そのもの」が変わることがあり、
それに伴って曜日も変わる可能性があります。

海外システムと連携する場合や、
「どのタイムゾーンの曜日を基準にするか」が重要な要件では、
ZonedDateTime で扱う方が安全です。


まとめ:曜日取得で身につけてほしい感覚

曜日取得は、「日付から曜日を安全に・意味のある型で取り出す」ことです。

LocalDate / LocalDateTime / ZonedDateTime の getDayOfWeek()DayOfWeek を得る。
内部ロジックでは DayOfWeek のまま扱い、表示の直前だけ文字列に変換する。
平日/土日判定などはユーティリティメソッドに閉じ込めて、あちこちに条件式をばらまかない。
表示用には DateTimeFormatterLocale を使って、曜日を含むフォーマットを定義する。

もしあなたのコードのどこかに、
「曜日を int で 0〜6 にして if 文でごりごり判定している」ような箇所があれば、
そこを一度 DayOfWeek ベースに書き換えられないか眺めてみてください。

その小さな一歩が、
“時間とカレンダーに強いエンジニア”への、確かな前進になります。

タイトルとURLをコピーしました