C#で日付や曜日を扱う際、曜日を文字列ではなく数値として取得したい場面は非常に多くあります。
データベースへの保存や、特定の曜日判定を行うロジックを実装する場合、数値で管理する方が効率的だからです。
本記事では、C#の標準的な機能であるDayOfWeek列挙型を中心に、曜日を整数(int)に変換する具体的な手順を解説します。
最新の.NET環境で推奨されるDateOnly型での操作も含め、実務で役立つテクニックを詳しく見ていきましょう。
DayOfWeek列挙型の基本構造と仕様
C#で曜日を扱うための最も基本的な要素は、System.DayOfWeek列挙型です。
この列挙型は、日曜日から土曜日までの各曜日を定義しています。
まず、DayOfWeek列挙型が内部的にどのような数値を持っているかを確認しましょう。
C#の標準仕様では、各曜日に以下の数値が割り当てられています。
| 曜日(英語) | DayOfWeekの値 | 対応する整数値(int) |
|---|---|---|
| Sunday | DayOfWeek.Sunday | 0 |
| Monday | DayOfWeek.Monday | 1 |
| Tuesday | DayOfWeek.Tuesday | 2 |
| Wednesday | DayOfWeek.Wednesday | 3 |
| Thursday | DayOfWeek.Thursday | 4 |
| Friday | DayOfWeek.Friday | 5 |
| Saturday | DayOfWeek.Saturday | 6 |
C#のデフォルト設定では、日曜日が「0」から始まるという点に注意が必要です。
これは、多くのプログラミング言語やデータベースで採用されている一般的な仕様です。
DateTimeから曜日を数値(int)で取得する方法
現在の時刻や特定の日付から曜日を数値で取得するには、DateTime.DayOfWeekプロパティを使用します。
このプロパティはDayOfWeek列挙型を返すため、int型にキャスト(型変換)することで数値を取得できます。
具体的なコード例を確認してみましょう。
using System;
// 現在の日時を取得
DateTime now = DateTime.Now;
// DayOfWeek列挙型を取得
DayOfWeek dayOfWeek = now.DayOfWeek;
// int型にキャストして数値化
int dayValue = (int)dayOfWeek;
Console.WriteLine($"本日の曜日: {dayOfWeek}");
Console.WriteLine($"曜日の数値: {dayValue}");
本日の曜日: Monday
曜日の数値: 1
このように、(int)と記述するだけで簡単に数値変換が可能です。
この数値を利用すれば、switch文を用いた条件分岐や、配列のインデックス指定などがスムーズに行えます。
.NET 6以降で推奨されるDateOnlyでの曜日取得
.NET 6以降では、時刻情報を含まない日付専用の型であるDateOnlyが導入されました。
誕生日や記念日、業務上の業務日など、時刻が不要なケースではDateOnly型を使うことが推奨されます。
DateOnlyでもDateTimeと同様に、DayOfWeekプロパティから数値を抽出できます。
using System;
// 特定の日付を作成(2026年5月11日)
DateOnly targetDate = new DateOnly(2026, 5, 11);
// 曜日を数値で取得
int dayValue = (int)targetDate.DayOfWeek;
Console.WriteLine($"{targetDate} の曜日数値は {dayValue} です。");
2026/05/11 の曜日数値は 1 です。
DateOnlyを使用することで、不要な時刻情報の混入を防ぎ、コードの意図がより明確になります。
モダンなC#開発においては、日付のみを扱う場合は積極的にDateOnlyを活用しましょう。
ISO 8601形式(月曜日=1)で数値化する方法
ビジネス要件によっては、月曜日を1、日曜日を7として扱いたい場合があります。
これはISO 8601という国際規格に基づく曜日の数値表現です。
しかし、C#のDayOfWeekは日曜が0であるため、単純なキャストではこの要件を満たせません。
月曜日を1とする数値を取得するには、以下のような計算ロジックを実装するのが一般的です。
using System;
public static int GetIsoDayOfWeek(DateTime date)
{
// C#標準: 日0, 月1, 火2, 水3, 木4, 金5, 土6
// ISO標準: 月1, 火2, 水3, 木4, 金5, 土6, 日7
int day = (int)date.DayOfWeek;
// 日曜日(0)の場合は7に変換、それ以外はそのまま
return (day == 0) ? 7 : day;
}
// 実行例
DateTime sunday = new DateTime(2026, 5, 10);
Console.WriteLine($"日曜日のISO数値: {GetIsoDayOfWeek(sunday)}");
日曜日のISO数値: 7
このように三項演算子を使うことで、標準の値をISO規格の数値に簡単に変換できます。
集計処理などで「1週間を月曜から始めたい」場合には、この変換処理が不可欠です。
数値から曜日名(文字列)に変換するテクニック
逆に、データベースに保存していた数値(int)から、ユーザーに表示するための曜日名を取得したいこともあります。
この場合は、数値を再度DayOfWeek列挙型にキャストし、ToString()メソッドやToString("dddd")を使用します。
日本語の曜日名を取得したい場合は、CultureInfoを指定するのが確実です。
using System;
using System.Globalization;
int dayInt = 3; // 水曜日の想定
// 数値を列挙型に変換
DayOfWeek dayEnum = (DayOfWeek)dayInt;
// 日本語の文化情報を指定して曜日名を取得
string dayNameJp = dayEnum.ToString("dddd", new CultureInfo("ja-JP"));
string dayNameShortJp = dayEnum.ToString("ddd", new CultureInfo("ja-JP"));
Console.WriteLine($"数値 {dayInt} は 日本語で {dayNameJp} ({dayNameShortJp}) です。");
数値 3 は 日本語で 水曜日 (水) です。
ToString(“dddd”)を使うことで「〇曜日」という形式が取得できるため、非常に便利です。
多言語対応が必要なアプリケーションでは、この方法で動的に表示を切り替えることができます。
拡張メソッドで曜日数値の取得を効率化する
プロジェクト内で頻繁に曜日の数値変換を行う場合は、拡張メソッドを作成しておくと便利です。
拡張メソッドを定義することで、dateTime.ToWeekdayInt()のような直感的な記述が可能になります。
using System;
public static class DateTimeExtensions
{
// 標準の数値を返す拡張メソッド
public static int ToInt(this DayOfWeek day)
{
return (int)day;
}
// ISO 8601形式の数値を返す拡張メソッド
public static int ToIsoInt(this DayOfWeek day)
{
return (day == DayOfWeek.Sunday) ? 7 : (int)day;
}
}
// 呼び出し側
DayOfWeek day = DateTime.Now.DayOfWeek;
int value = day.ToIsoInt();
このように共通ライブラリ化しておくことで、チーム全体で実装ミスを防ぎ、可読性を高めることができます。
特に「日曜日の扱い」に関するバグは発生しやすいため、一箇所にロジックを集約することは非常に重要です。
曜日の数値を扱う際の注意点とTips
曜日の数値を扱う際には、いくつか注意すべきポイントがあります。
まず、DayOfWeek列挙型の範囲外の数値をキャストしないよう注意しましょう。
例えば、数値の「7」をDayOfWeekにキャストしても、定義されていないため意図しない動作を招く可能性があります。
また、データベースによっては曜日の数値開始位置が異なる場合があります。
例えば、SQL ServerのDATEPART(weekday, ...)は、言語設定によって結果が変わることがあります。
「C#側で数値を決定するのか、データベース側で計算させるのか」を統一することが、不具合を避ける鍵となります。
さらに、シリアル化(JSON出力など)を行う際、デフォルトでは列挙型の名前文字列が出力されることがあります。
APIなどで数値を返したい場合は、プロパティの型をintとして定義するか、シリアライザの設定を確認してください。
まとめ
C#で曜日を数値に変換する方法について、基礎から応用まで解説してきました。
DateTimeやDateOnlyのDayOfWeekプロパティを(int)でキャストするのが最も基本的な手法です。
標準では「日曜日=0」となりますが、ISO規格に合わせる場合は「日曜日=7」とする工夫が必要です。
また、数値から「水曜日」といった表示文字列への再変換には、CultureInfoを活用したフォーマット指定が有効です。
これらのテクニックを組み合わせて、日付処理に強い堅牢なプログラムを構築してください。
モダンな開発においては、DateOnly型を積極的に活用し、可読性の高いコードを目指しましょう。
