年月日から曜日を求める数式


公開 (UL): 2020-12-22
更新 (UD): 2020-12-22
閲覧 (DL): 2026-04-06

この記事のもくじ

→本文へ
当サイトは SNS の公式アカウントがないので,「議論ネタ」にする際は,皆さんのブログ,メーリングリスト,SNS や掲示板などで,適当にハッシュタグを付けたりリンクを掲載するなどしてご利用ください。

前の記事

2020-06-07
存在不明のパス名からディレクトリを構築する

次の記事

2021-02-23
五十音の「辞書順」の処理

最近の記事

2024-02-11
XMPP - 長く使える安心チャット
2023-01-16
Android のキーボード・ショートカット一覧
2023-09-15
Perl の正規表現での A と Z の扱い
2022-08-09
代表的な画像ファイル形式一覧
2022-04-04
サイトのローカル試験と実ウェブ上の差を縮める手法(Perl)
新着情報
She appears also the top page.

新着情報 Recent docs.

Sorry, but most of these pages are only Japanese.
現場で活きる「電子工作」 «Get starting electronics handmaking!»
政権政党圧勝により介護福祉制度の改悪は必至! 現場の自助・自衛のための機器「手作り」入門!

人気記事 Frequent view pages.

おすすめ! Recommend

ご連絡 Contact

▼ メールフォームはこちら
SSL 証明書の更新に不具合が多いため,期限切れエラーが出た際は,お手数ですが「例外指定」をお願いいたします。

ファイルの暗号化
当サイト管理者(石川)宛にメール添付で送信するファイルを暗号化したい時は,唯一のパスワードを PPOP で取得できます。 PPOP gives a password for encryption of the file(s) attached your mail to the admini­strator of this site M.Ishikawa.
PPOP

MEMO / Email to the Author
あとで調べたい点のメモなどに利用可能。
下部ボタンでそのまま著者にメールできます。


CAPTCHA: easy math prob in Japanese

時事川柳 News Senryu

颯爽と  
アソー出てきて
  轍を踏む
Aso will finish the government of LDP also this time.

以前もこの方が(げや→)下野に導いたんでしょって。

(⌚2025-10-12)

ご支援 Support this site.

まだまだ コロナ失業中!!
CORONA-NEET, seeking works now!

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).
都道府県庁さん, 地方自治体さんや教育委員会さん, 障害者就労支援機関さんやその他公的機関,省官庁さん, 「タダ見」しているだけでは, 格差が広がるだけだと思いませんか?
Welcome!
Alibaba    Google
The companies, thanks for many accesses every months! Are the articles I wrote helping for increasing your income? Although, I cannot get even a penny and jobs from that.

 年月日から曜日を求める式がかなり短く書けると分かったためメモ。

 A simple function to get the weekday from Year-Month-Day.

 調べたら「ツェラーの公式」ってのもあるらしいが,「1月と2月は前年の 13・14 月として計算する」とか……ややこしいやん。if 文が余計に要るやん。
 ここ 200 年ほど(1900-3~2100-2)は,「100 の倍数で 400 の倍数でない年は閏年にしない」という法則を考えずに済むから,この期間に限定すれば,かなりシンプルになる。そこで,if 文が不要で,短い式1つで済む方法を考えてみた。

 なお,この記事内では月の数値は 1~12。もし 0~11 を使う場合はソース内の以下の部分を置き換える。

▼ 月が 0~11 の場合 (When 0:Jan - 11:Dec)
   mon < 3   →   mon < 2
   mon + 9   →   mon + 10

● C言語

 Cでは整数の割り算は「切り捨て」てくれる点で,このアルゴリズム的にはありがたい。かなり短く書ける。

▼ 年月日から曜日を求める (C-lang)
   int	weekday( int year, int mon, int day ){  // 0:Sun - 6:Sat
	return( ( (year -(mon < 3 ? 1 : 0))* 5 / 4 +
	    ((( mon + 9 )% 12)* 13 + 2)/ 5 + day + 1)% 7 );
   }

● JavaScript

 JavaScript には Date というクラスがあって,そのオブジェクトで曜日を取得する getDay() というメソッドもあるから,関数を独自定義する必要性は薄いが,フォームなどの年月日が個別に指定されたデータでそれを使おうとすると,いちいち setYear() などのメソッドを呼び出す必要がある。年月日から曜日が分かる関数があれば,コード全体も簡単になると思われる。
 ただ,自動で切り捨てはされず,Math オブジェクトの floor 関数を使う必要があるから,記述は少々面倒。

▼ 年月日から曜日を求める (JavaScript)
   function weekday( year, mon, day ){  // 0:Sun - 6:Sat
	return( ( Math.floor( (year -(mon < 3 ? 1 : 0))* 5 / 4 )+
	  Math.floor( ((( mon + 9 ) % 12)* 13 + 2)/ 5 )+ day + 1)% 7 );
   }

 曜日を文字で得たい時はこんな感じか。

▼ 年月日から曜日を表示 (Japanese)
   "日月火水木金土".charAt( weekday( year, mon, day ) )
▼ 年月日から曜日を表示 (English, abbreviation)
   "SunMonTueWedThuFriSat".substr( 3 * weekday( year, mon, day ), 3 )
▼ 年月日から曜日を表示 (English, fullspell)
   ["Sun","Mon","Tues","Wednes","Thurs","Fri","Sat"]
	[ weekday( year, mon, day ) ]+"day"

● Perl

 「切り捨て」に int 関数を使う必要がある点以外は,そのまま。

▼ 年月日から曜日を求める (perl)
   sub weekday { my ( $year, $mon, $day )= @_; # 0:Sun - 6:Sat
	return( ( int( ($year -($mon < 3 ? 1 : 0))* 5 / 4 )+
	  int( ((( $mon + 9 ) % 12)* 13 + 2)/ 5 )+ $day + 1)% 7 );
   }

 曜日を文字で得たい場合,たとえば UTF-8 でエンコードされている処理系だと,1文字=3バイトになるから,こうする必要がある。

▼ 年月日から曜日を表示 (UTF-8)
   substr( "日月火水木金土", weekday( year, mon, day )* 3, 3 )

 perl の文字列では,正確に1文字単位で扱う「内部表現」モードが存在する。その場合は,上記式の 3 を 1 にして使う。つまり,こう。

▼ 年月日から曜日の文字を得る (Perl's internal charcode)
   use	Encode qw(decode encode);
   my	$wd = decode( 'UTF-8', "日月火水木金土" );
	substr( $wd, weekday( year, mon, day ), 1 )

 ただ,このまま出力しても正しく表示しないので,出力する時には,Encode モジュールの encode ルーチンなどを使って UTF-8 などにエンコードする。詳しくは,Perl の Encode モジュール POD などを参照。

● 表計算

 そもそも表計算ソフトには,WEEKDAY() という曜日を求める関数がある。ただ,その引数は,日付(年月日)を表す「ひとつの数値」である必要があって,年月日が別々のセルに記載されている場合は使えない。
 まぁそんな場合でも,以下のようにすればいい(year,mon,day はそれぞれセル名)。ただし,求まる値は 1:Sun - 7:Sat となる点で,他と異なる。

▼ 年月日から曜日を求める (Spreadsheet)
   =WEEKDAY( DATE( year, mon, day ) )


© M.Ishikawa; TREEWARE 2026.