システム開発におけるスケジュール処理や、Excel・スプレッドシートを用いた大量データの集計業務において、「特定の日付から曜日を導き出す」というロジックは頻繁に登場します。
しかし、単純に日付データをそのまま処理しようとすると、うるう年の判定漏れや、月によって日数(28〜31日)が異なることによる計算ズレが発生しがちです。手動での確認や手計算に頼っていると、1月・2月の特殊な月跨ぎ処理やうるう年の境目で意図しないバグや集計ミスを引き起こすリスクが高まります。
この記事を読むより前に、作成した計算ロジックの挙動テストやExcel数式の出力結果が正しいか今すぐブラウザ上でデバッグ・検証したい場合は、以下の完全ローカル処理型ツールを直接ご活用ください。
▶ 今すぐこのツールで曜日判定・日付計算の正確性を検証する(登録不要・完全ブラウザ完結)
ツェラーの公式(Zeller's congruence)による曜日計算アルゴリズム
プログラム(JavaScript、Python、C#など)で西暦年月日(Y年M月D日)から直接曜日を算出する際の標準的なアルゴリズムが ツェラーの公式(Zeller's congruence) です。
ツェラーの公式では、グレゴリオ暦において以下の計算式を用いて曜日を表す数値(h)を求めます。
計算式と変数の定義
$h = (D + \lfloor \frac{13(M+1)}{5} \rfloor + Y + \lfloor \frac{Y}{4} \rfloor - \lfloor \frac{Y}{100} \rfloor + \lfloor \frac{Y}{400} \rfloor) \bmod 7$
※ $\lfloor x \rfloor$ は床関数(小数点以下の切り捨て)を表します。
ここで使用する変数には、カレンダー計算特有の重要なルールが存在します。
- D: 日(1〜31)
- M: 月(3〜14)。1月と2月は前年の13月・14月として扱います(例: 2026年1月は「2025年13月」、2026年2月は「2025年14月」として計算)。
- Y: 年(下2桁、または1月・2月の補正を行った後の年)。全体の西暦年をC(世紀: 年/100)とY(年: 年%100)に分ける形式もありますが、上記の統一式では補正後の西暦年をそのまま適用可能です。
算出された数値(h)と曜日の対応
計算結果のあまり($h$)に対応する曜日は以下のようになります。
| 計算結果(h) | 判定される曜日 |
|---|---|
| 0 | 土曜日 |
| 1 | 日曜日 |
| 2 | 月曜日 |
| 3 | 火曜日 |
| 4 | 水曜日 |
| 5 | 木曜日 |
| 6 | 金曜日 |
アルゴリズム組み込み時の注意点
1月と2月を「前年の13月・14月」として計算する補正を忘れると、年頭の曜日判定がすべて大きくズレてしまいます。開発現場でアルゴリズムを自作した際、「3月以降は正しく動くのに1月と2月だけ1日ズレる」という不具合の原因は、ほぼこの月補正の考慮漏れによるものです。
また、言語の仕様によって負の数の余り(モジュロ演算)の挙動が異なる場合があるため、プログラミング言語ごとの割算の実装ルールに注意を払う必要があります。
Excel・スプレッドシートにおけるWEEKDAY関数の実装と自動化
ExcelやGoogleスプレッドシートで数千件規模の日付リストから特定曜日のデータを抽出したり、条件付き書式で土日を自動ハイライトする場合は、組み込み関数である WEEKDAY関数 を使用するのが最も効率的です。
WEEKDAY関数の基本文法
WEEKDAY(シリアル値, [種類])
- シリアル値: 判定対象となる日付セル(例:
A2)を指定します。 - 種類(戻り値の形式): 計算結果として返される数値の割り当てパターンを指定します。
種類パラメータの指定パターンと戻り値一覧
| 種類(値) | 戻り値の範囲 | 曜日の割り当て(1の基準) | 主な用途・利用シーン |
|---|---|---|---|
| 省略 または 1 | 1 〜 7 | 1 = 日曜日, 7 = 土曜日 | 米国式カレンダー・標準設定 |
| 2 | 1 〜 7 | 1 = 月曜日, 7 = 日曜日 | ISO 8601準拠・月曜始動の業務集計 |
| 3 | 0 〜 6 | 0 = 月曜日, 6 = 日曜日 | プログラミングの配列インデックス連携 |
| 11 | 1 〜 7 | 1 = 月曜日, 7 = 日曜日 | 種類2と同等(Excel 2010以降) |
WEEKDAY関数とTEXT関数・IF関数の組み合わせ例
- 曜日名を文字列で出力する場合:
=TEXT(A2, "aaa")(例: 「月」と表示)=TEXT(A2, "aaaa")(例: 「月曜日」と表示) - 土日を判定して「休業日」、平値を「営業日」と出力する場合:
=IF(WEEKDAY(A2, 2) >= 6, "休業日", "営業日")※種類に「2」を指定することで、6(土曜)と7(日曜)をまとめて「>= 6」のシンプルな条件式で判定できます。
私自身も以前、大量の顧客対応ログをスプレッドシートで集計する際、WEEKDAY関数の第二引数(種類)を省略したまま組み込んでしまい、月曜始まりの計算式と噛み合わず「日曜日のデータが月曜日にカウントされる」という集計ミスを引き起こしたことがあります。数式を組む際は、どの曜日が「1」に対応しているかを必ず確認することが重要です。
自作した関数やIF文の条件分岐が正しく動いているか不安な場合は、Web上で正確な曜日と日付を出力するシミュレーターを使って、境界値テストを実施することをおすすめします。
▶ 実装した数式の検証・Webデバッグツールとして日付計算ツールを試す(無料・登録不要)
個人開発ツールにおける「完全ローカル処理」の安全性
システム開発のデバッグや業務データの検証を行う際、社内の未公開スケジュール、個人情報を含む生年月日データ、リリース前のプロジェクト日程などをWeb上の便利ツールに入力する機会があります。
しかし、一般的なWebサービスの中には、入力されたテキストや日付データをバックエンドのWebサーバーへ送信して処理したり、アクセスログとしてデータベースに記録・保持する仕組みを持つものが少なくありません。万が一サーバー側で通信傍受やログ漏洩が発生した場合、重要な情報が外部へ露出するリスクが残ります。
当サイトで提供している「日付・日数計算ツール」は、こうした懸念を解消するために 完全ブラウザ完結設計(JavaScriptによるクライアントサイド処理) を採用しています。
入力された日付データや計算処理は、インターネット上の外部サーバーへ送信されることなく、すべてユーザーがお使いのスマートフォンやPCのブラウザ(JavaScript実行環境)内のみで完結します。
開発者を含む第三者が入力された日付情報や計算内容をログとして取得・共有する仕組み自体が存在しない設計となっているため、業務上の機密データを含む日付確認やアルゴリズムの動作検証においても、安心して作業を進めることができます。
開発・分析作業の効率を高める日付ロジックの検証手順
ツェラーの公式によるプログラミング実装や、WEEKDAY関数を用いたExcelのロジック構築を行った後は、エッジケースを含めたテストが欠かせません。以下のポイントを事前に検証しておくことで、本番運用時のバグを最小限に防ぐことができます。
- 閏年(うるう年)の2月29日を含む計算判定: 西暦が4で割り切れる年はうるう年ですが、「100で割り切れ、かつ400で割り切れない年(例: 1900年、2100年)」は平年となります(2000年はうるう年)。対象期間内に2月29日を跨ぐ計算が含まれている場合、1日分のズレが発生しないかを検証します。
- 1月・2月の境界値判定: ツェラーの公式をプログラムへ組み込んだ際、1月1日〜2月28日(29日)のデータを与えて、前年換算処理(13月・14月処理)が正しく行われているかを確認します。
- 和暦・西暦変換との連携確認: 明治・大正・昭和・平成・令和の元号切り替え日付近の日付(例: 平成元年は1989年1月8日から開始)において、表示と曜日の整合性が取れているかをチェックします。
自作プログラムのテストコードを実行する前の簡易チェックや、Excelの大量データ適用前のサンプル動作確認には、即座に正しい曜日・和暦・差分日数を導き出せる専用ツールを1つの「Webデバッグ環境」として活用するのが極めてスムーズです。
正確なアルゴリズム検証と安全なデータ処理を両立させるため、ぜひ日常の開発・集計業務の傍らでお手元のツール環境をご活用ください。
