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


公開 (UL): 2020-12-22
更新 (UD): 2020-12-22
閲覧 (DL): 2021-10-17

この記事のもくじ

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

前の記事

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

次の記事

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

最近の記事

2021-06-01
Base54
2021-06-01
PPOP
2021-03-04
全角⇔半角の変換
2020-05-04
UTF-8 文字(列)と UNICODE の変換
2020-05-04
エスケープ文字変換/復元
新着情報

新着情報 Recent docs.

Sorry, but almost these pages are only Japanese.
「使命」を捨てる日本のマスコミ «The Japanese mass-communication companies desert their essential missions, and make worse in society.»
日本のマスコミが「社会的問題を悪化させる」ような報道を続ける構造的問題。
現場を知らないメーカーの夢想 «Makers say "we'll make good!" without investigation of working on-the-job.»
日経新聞記事の感想。「遠隔操作ロボットが医療介護現場で人材を活かす」という眉唾。
PPOP «Password encrypted file is sent and the Password is notified Otherway Protocol.»
一般的な暗号化ファイルのパスワードを安全に伝える方法。
「マイナンバー」が危険なこれだけの理由 «The reasons of "My-Number System" is danger.»
それでも「マイナンバー」を推す裏の理由を推察。
デジタル化なら「スタイル編集」すべき «Let's "Style-Editting" with word-processor application.»
ワープロで「書式設定」の代わりに「スタイル編集」することで使える様々な便利機能。

人気記事 Frequent view pages.

[半角/全角/漢字] キーの使い方 «What functions does [半角/全角/漢字] key have.»
アクセス急上昇! 日本語モードかどうか確認せず確実な文字入力を実現する方法。
表計算で「令和」に対応する方法
How to adapt the Gengo era "Reiwa" on spreadsheet applicaiton.

古いアプリも OK。「表計算 令和」の検索結果上位御礼!
表計算ソフトで予定表を自動作成する超便利な方法 «How to make the schedule table automatically on spread-sheet.»
「毎月第○×曜日」的な法則は自動で作らせてラクしよう!
表計算ソフトに「個人情報保護機能」を仕込む方法 «Prevention to leak private-data with spread-​sheet macro function.»
「漏えい」のためのフェイルセーフ。「表計算 個人情報」の検索結果上位御礼!
Wary-Basher (ワリバッシャー)
DIY device that enables the handicapped to operate many things with a switch like push-button.

障害者の様々な操作をスイッチ操作で実現する器具。キットも発売中! 「作り方」PDF ダウンロード多数御礼!←地方教育委で人気。
貧乏人を殺す行政の構造 «Structurally, the administrators kill the poors in Japan.»
ヘタすると多摩川に流されるところだった台風 19 号

この記事に対する → 調布市の反応

おすすめ! Recommend

「事故防シート」について «Cared persons taking with "Jiko-​Bow-​Sheet" prevents from accidents.»
介護現場の負担軽減と事故防止のアイデア
【連載】 キーボードの「キー」の詳しい使い方 «The detial of usage each key on keybord.»
各キーの機能詳細。機能別五十音順一覧。
和易ゐ記 (WAI-WIKI) «WAI-WIKI is light­weight markup language for Japanese, and generates HTML on this server on-​demand.»
当サイトで開発/使用中の日本語向けに特化した軽量マークアップ言語

ご連絡 For contact safely.

当サイト管理者(石川)への連絡内容の機密保持には,こちらで取得できるパスワードをご利用ください。 Get password for file(s) encryption to send the admini­strator of this site M.Ishikawa.

ご支援 Support this site.

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).

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

 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 2021.