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


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

この記事のもくじ

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

前の記事

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

次の記事

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

最近の記事

2022-04-04
サイトのローカル試験と実ウェブ上の差を縮める手法(Perl)
2021-12-17
Perl で利用宣言時にモジュールをカスタマイズする
2021-06-01
Base54
2021-06-01
PPOP
2021-03-04
全角⇔半角の変換
新着情報

新着情報 Recent docs.

Sorry, but almost these pages are only Japanese.
日本の「IT 人材不足」の正体 «The simple reason why Japanese companies lack IT-skill.»
保険会社からのセキュリティガバガバメールが「IT 人材不足」の正体を暴く。
QR コードの功罪 «"Un-readable QR-code" discloses incompetences of the government in Nishi-tokyo city.»
「読めない QR コード」に見えたオヤクショの無能さ。
パソコンを無改造で障害者対応にするヒント «The hints of PC fitting for persons with disabilities without technical work.»
部品屋さんのサイトで見つけた, 安いけど工夫次第で超便利に使えそうな製品をご紹介。
現場を知らないメーカーの夢想 «Makers say "we'll make good!" without investigation of working on-the-job.»
日経新聞記事の感想。「遠隔操作ロボットが医療介護現場で人材を活かす」という眉唾。
「マイナンバー」が危険なこれだけの理由 «The reasons of "My-Number System" is danger.»
それでも「マイナンバー」を推す裏の理由を推察。

人気記事 Frequent view pages.

表計算で「令和」に対応する方法
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

文字ベース天気予報 «Weather forecast in text mainly from JMA Json-data.»
古いブラウザやスマホ,音読ソフトでも大丈夫! 気象庁の JSON データを利用した文字ベースの天気予報(試験版)。
「事故防シート」について «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.

時事川柳 News Senryu

ワクチンを
 「打って変わった」
  厚労省

 厚労省が外部からの指摘で統計を修正したら,ワクチン2回接種者より未接種者のほうが感染率が低くなったって話(参考記事: CBC テレビ日経ビジネス)。 子供向けの国語の問題か何かで,「打って変わって」を使って短文を作るというお題に「お父さんは薬を『打って変わって』しまった」という間違った使い方がネットで話題になっていたのを思い出した。 ワクチンには,思考能力を減衰させる副反応もあるのかもね。 ちなみに,当サイト管理人はアレルギーの関係で未接種。 何が「ワクワク割」だ!? (2022-06-06)

ご支援 Support this site.

でも絶賛 コロナ失業中!!
CORONA-NEET, seeking works now!

この活動をご支援いただける方はこちらへ 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 2022.