C# Tips | 日付・時間処理:曜日取得

C# C#
スポンサーリンク

はじめに 「曜日取得」は“人間に寄り添う日付表示”の入口

日付そのものだけでなく、「それが何曜日か」は業務画面でかなり重要です。
勤怠、シフト、予約、カレンダー、締切日…どれも「曜日」が一緒に出ていると、ユーザーの理解が一気に早くなります。

C# では、DateTimeDateOnly から簡単に曜日を取り出せます。
さらに、実務では「日本語の曜日文字列にしたい」「平日か休日かを判定したい」といったニーズも出てきます。

ここでは、
基本の DayOfWeek から始めて、
日本語表示、ユーティリティ化、平日・休日判定まで、
初心者向けにかみ砕いて説明していきます。


基本:DateTime.DayOfWeek で曜日を取り出す

DayOfWeek 列挙体をそのまま使ってみる

一番シンプルな曜日取得は、DateTimeDayOfWeek プロパティです。

using System;

DateTime d1 = new DateTime(2026, 2, 10); // 2026/02/10

DayOfWeek w1 = d1.DayOfWeek;

Console.WriteLine(d1);  // 2026/02/10 0:00:00
Console.WriteLine(w1);  // Tuesday
C#

DayOfWeek は列挙体(enum)で、
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
のいずれかが入ります。

英語の曜日名でよければ、このまま ToString() しても構いません。
ただ、業務システムでは日本語表示が欲しくなることが多いので、次でそこを深掘りします。


日本語の曜日文字列に変換する

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

「火」「火曜」「火曜日」のような日本語の曜日文字列は、
DayOfWeek から自分でマッピングしてあげる必要があります。

一番分かりやすいのは switch です。

using System;

public static class WeekdayUtil
{
    public static string ToJapaneseShort(DayOfWeek dayOfWeek)
    {
        switch (dayOfWeek)
        {
            case DayOfWeek.Sunday:    return "日";
            case DayOfWeek.Monday:    return "月";
            case DayOfWeek.Tuesday:   return "火";
            case DayOfWeek.Wednesday: return "水";
            case DayOfWeek.Thursday:  return "木";
            case DayOfWeek.Friday:    return "金";
            case DayOfWeek.Saturday:  return "土";
            default:                  return "";
        }
    }

    public static string ToJapaneseLong(DayOfWeek dayOfWeek)
    {
        return ToJapaneseShort(dayOfWeek) + "曜日";
    }
}
C#

使い方はこうなります。

DateTime d = new DateTime(2026, 2, 10); // 火曜日

DayOfWeek w = d.DayOfWeek;

string shortJp = WeekdayUtil.ToJapaneseShort(w);
string longJp  = WeekdayUtil.ToJapaneseLong(w);

Console.WriteLine(shortJp); // 火
Console.WriteLine(longJp);  // 火曜日
C#

ここでの重要ポイントは、
DayOfWeek をアプリ内の“共通ルール”で文字列に変換する場所を一箇所にまとめる」ことです。
画面ごとにバラバラに "火" とか "火曜日" とか書き始めると、後から統一が難しくなります。


日付から直接「(火)」のような表示を作る

フォーマットと組み合わせて実務的な表示にする

日付と曜日をセットで表示したい場面はとても多いです。
例えば「2026年2月10日(火)」のような形です。

先ほどのユーティリティを使うと、こう書けます。

DateTime d = new DateTime(2026, 2, 10);

string dateText = d.ToString("yyyy年M月d日");
string weekday  = WeekdayUtil.ToJapaneseShort(d.DayOfWeek);

string display = $"{dateText}({weekday})";

Console.WriteLine(display); // 2026年2月10日(火)
C#

このパターンをよく使うなら、
「日付+曜日表示」をまとめたユーティリティにしてしまうとさらにスッキリします。

public static class WeekdayDisplayUtil
{
    public static string ToJapaneseDateWithWeekday(DateTime date)
    {
        string dateText = date.ToString("yyyy年M月d日");
        string weekday  = WeekdayUtil.ToJapaneseShort(date.DayOfWeek);
        return $"{dateText}({weekday})";
    }
}
C#

使い方はこうです。

Console.WriteLine(WeekdayDisplayUtil.ToJapaneseDateWithWeekday(d));
// 2026年2月10日(火)
C#

「日付+曜日」の表示ルールを一箇所に閉じ込めておくことで、
画面全体の表記ゆれを防ぎやすくなります。


実務でよく使う「平日/休日判定」ユーティリティ

土日かどうかを判定する

曜日を取れるようになると、次に欲しくなるのが「平日か休日か」です。
まずはシンプルに「土日を休日」とみなすパターンから。

public static class BusinessDayUtil
{
    public static bool IsWeekend(DateTime date)
    {
        DayOfWeek w = date.DayOfWeek;
        return w == DayOfWeek.Saturday || w == DayOfWeek.Sunday;
    }

    public static bool IsWeekday(DateTime date)
    {
        return !IsWeekend(date);
    }
}
C#

使い方の例です。

DateTime d1 = new DateTime(2026, 2, 9);  // 月
DateTime d2 = new DateTime(2026, 2, 10); // 火
DateTime d3 = new DateTime(2026, 2, 13); // 金
DateTime d4 = new DateTime(2026, 2, 14); // 土

Console.WriteLine(BusinessDayUtil.IsWeekday(d1)); // true
Console.WriteLine(BusinessDayUtil.IsWeekday(d2)); // true
Console.WriteLine(BusinessDayUtil.IsWeekday(d3)); // true
Console.WriteLine(BusinessDayUtil.IsWeekday(d4)); // false
C#

「平日だけ処理する」「休日はスキップする」といったロジックは、
このユーティリティを通すことで、
if (w != DayOfWeek.Saturday && w != DayOfWeek.Sunday) のような生コードを書かずに済みます。

祝日も含めた「営業日判定」への拡張

実務では、「土日だけでなく祝日も休み」としたいことが多いです。
その場合は、祝日判定ロジックを別に用意し、
それを組み合わせて「営業日かどうか」を判定します。

public static class BusinessDayUtil
{
    public static bool IsWeekend(DateTime date)
    {
        DayOfWeek w = date.DayOfWeek;
        return w == DayOfWeek.Saturday || w == DayOfWeek.Sunday;
    }

    public static bool IsHoliday(DateTime date)
    {
        // ここは別の祝日カレンダーロジックに委譲する想定
        // 実装例:
        // return JapaneseHolidayUtil.IsHoliday(date);
        return false;
    }

    public static bool IsBusinessDay(DateTime date)
    {
        return !IsWeekend(date) && !IsHoliday(date);
    }
}
C#

祝日ロジック自体は別のクラスに切り出しておき、
IsHoliday でそれを呼ぶようにしておくと、
「祝日の定義を差し替える」「テスト用にモックする」といった拡張がしやすくなります。


曜日を数値として扱うときの注意点

DayOfWeek の数値は「日曜が0」から始まる

DayOfWeek は列挙体なので、(int)DayOfWeek.Monday のようにキャストすると数値が取れます。
ただし、その値は「日曜が0、月曜が1、…土曜が6」という並びです。

Console.WriteLine((int)DayOfWeek.Sunday);    // 0
Console.WriteLine((int)DayOfWeek.Monday);    // 1
Console.WriteLine((int)DayOfWeek.Tuesday);   // 2
Console.WriteLine((int)DayOfWeek.Saturday);  // 6
C#

「月曜を0にしたい」「月〜金を 0〜4 にしたい」といった要件がある場合は、
自分で変換ルールを決める必要があります。

例えば「月曜を0、日曜を6」にしたいなら、こんな感じです。

public static int ToMondayZeroIndex(DayOfWeek dayOfWeek)
{
    // Sunday(0) → 6, Monday(1) → 0, Tuesday(2) → 1, ...
    int v = (int)dayOfWeek - 1;
    if (v < 0) v += 7;
    return v;
}
C#

曜日を数値で扱うときは、
「何を0としているか」を必ずコメントやメソッド名で明示しておくと、
後から見たときに混乱しません。


まとめ 「曜日取得ユーティリティ」は“日付を人間の感覚に近づける”

曜日取得は、
日付を「人間にとって分かりやすい情報」に変えるための大事な一歩です。

押さえておきたいポイントを整理すると、こうなります。

DateTime.DayOfWeekDayOfWeek 列挙体(Sunday〜Saturday)が取れる。
日本語の曜日文字列(「火」「火曜日」など)は、自前のマッピング(switch など)でユーティリティ化しておくと、表記ゆれを防げる。
日付+曜日表示(例: 2026年2月10日(火))は、フォーマットと曜日ユーティリティを組み合わせた専用メソッドにしておくと、画面コードがスッキリする。
平日/休日判定は「土日かどうか」から始め、必要に応じて祝日ロジックを組み合わせて「営業日判定」に拡張する。
DayOfWeek を数値にキャストすると「日曜=0」になるので、月曜始まりなど別の基準が欲しいときは、自分で変換ルールを決めてユーティリティに閉じ込める。

ここを押さえておくと、
「とりあえず DayOfWeek を出している」状態から一歩進んで、
“人間の感覚に寄り添った、実務で使える曜日ユーティリティ”を
自分のC#コードの中に自然に組み込めるようになっていきます。

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