曜日取得のゴールイメージ
「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)であることです。
MONDAY〜SUNDAY まで 7 つの定数を持ち、getValue() は「月曜=1 … 日曜=7」という数値を返します。
ポイントは二つあります。
ひとつは、「曜日を“意味のある型”として扱える」こと。
単なる int や String ではなく 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() は同じ
LocalDateTime も getDayOfWeek() を持っています。
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 のまま扱い、表示の直前だけ文字列に変換する。
平日/土日判定などはユーティリティメソッドに閉じ込めて、あちこちに条件式をばらまかない。
表示用には DateTimeFormatter と Locale を使って、曜日を含むフォーマットを定義する。
もしあなたのコードのどこかに、
「曜日を int で 0〜6 にして if 文でごりごり判定している」ような箇所があれば、
そこを一度 DayOfWeek ベースに書き換えられないか眺めてみてください。
その小さな一歩が、
“時間とカレンダーに強いエンジニア”への、確かな前進になります。
