こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

カレンダーをプログラミング

現在、カレンダーをプログラミングで作成しています。
カレンダーの土日を色づけして表示するところまでは、出来たのですが、祝日でつまづいています。
企業などで、休みは暦通りや、カレンダー通りという言葉を耳にしますが、これを作成するには祝日の振り替え休日のロジックがわかりません。

どの祝日は振り替え休日となるのか、何曜日に対して振り替えされるのか、振り替えされない場合など、ルールがわかりません。

どなたか、詳しい方アドバイスよろしくお願いいたします。
参考URLなどあると助かります。

尚、現在テストプログラムはExcel_VBAで作成しています。
今後、VBかC#でも作成する予定です。

よろしくお願いします。

投稿日時 - 2014-11-25 21:11:34

QNo.8837290

すぐに回答ほしいです

質問者が選んだベストアンサー

http://www.h3.dion.ne.jp/~sakatsu/index.htm
がとっても^100 参考になるかと思います。
法令そのものの解説もありますし、考え方も載せてくれています。
週末にでもじっくり読んでみてください。
コードは上記リンク中の「祝日判定ロジック」を読まれることをお勧めします。
VBA、C# ・・・色々と有志の方々が参加されています。

春分の日・秋分の日についてですが
以前(質問者さんは生まれていないかも)に天文学的に微妙な場合がありまして
国の決定した祝日とカレンダー屋さんのが異なることがありました (^_^;)
カレンダー屋さんは早い物は秋口から刷りはじめます。
結果、当社で配るカレンダーには修正シールが付いてきて
みんなでペタペタ貼っていた記憶があります。
それ以来?、前年の2月に官報で発表されることになりました。

投稿日時 - 2014-11-26 10:07:18

お礼

アドバイスありがとうございます。
シールが貼ってあるカレンダーを以前見たことがあります。

現在、テストでExcelVBAでカレンダーのレイアウト表示と、土日色づけまで作成したのですが、春分と秋分の日を考慮すると、APIにした方が良いのかも・・・と悩んでいます。

思い切って、両方作ってしまうつもりです。
C#+APIが後々考えると使いまわしもできて、良い気もするのですが、APIのバージョン変更などの対応が少し気がかりです。

いろいろ試してみます。
アドバイス参考になりました。ありがとうございました。

投稿日時 - 2014-11-26 20:09:16

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

APIを駆使したとしても
天文学的な計算で算出していることには違いが無いので
「微妙な境界線」の場合には
カレンダー屋さんの悲劇は避けられません。

投稿日時 - 2014-11-26 21:19:10

ANo.4

正確には「日本国の法令を見てください」となります。
http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
> 第3条
> 2.「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。


ですが、春分/秋分のように「前年まで決まらない」ものがあったりするので、(振替休日も含めて)信頼できるデータを利用するのが現実的でしょう。
上のサイトにも
> 平成26年(2014)の国民の祝日
> 5月6日及び11月24日は休日となります。
とあります。

投稿日時 - 2014-11-25 22:31:08

お礼

「前年まで決まらない」が曲者ですね。
やはり、オンラインからデータを取得する方が無難かもしれません。

前年まで決まらない日が振り替え休日となった場合、プログラムを静的に記入しておくのはリスクですね。

動的に取得する方法も検討します。
非常に参考になりました。ありがとうございました。

投稿日時 - 2014-11-26 07:04:16

ANo.3

if (yyyy == YYYY && mm == MM && dd == DD) document.write('<font color=green><b>');
else if (x == 0) document.write('<font color=red>');
else if (x == 6) document.write('<font color=blue>');

if (DD >= 1 && DD <= monthDay[MM - 1]) document.write(DD);
else document.write('<br>');

if (yyyy == YYYY && mm == MM && dd == DD) document.write('</b></font>');
else if (x == 0) document.write('</font>');
else if (x == 6) document.write('</font>');

if (sf >= 1) document.write('</a>');

if (sf >= 1 && x == 0) snext = 1;
if (sf == 16) snext = 0;

document.write('</td>');
}
document.write('</tr>');
}
document.write('</table>');
}

//--->
</script>

投稿日時 - 2014-11-25 21:52:47

ANo.2

JavaScript で作ったものがありますので、半分に分けて書き込みます。
<script language="JavaScript">
<!---

function cal(YYYY, MM){
monthDay = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
monthName = new Array("1-睦月","2-如月","3-弥生","4-卯月","5-皐月","6-水無月","7-文月","8-葉月","9-長月","10-神無月","11-霜月","12-師走");
saijituNM = new Array("元日","成人の日:第2月曜日","建国記念の日","春分の日","昭和の日","憲法記念日","みどりの日","こどもの日","海の日:第3月曜日","敬老の日:第3月曜日","秋分の日","体育の日:第2月曜日","文化の日","勤労感謝の日","天皇誕生日","国民の休日");
syunbun = new Array(20,20,21,21,20,20,21,21,20,20,21,21,20,20,21,21,20,20,21,21,20);
syuubun = new Array(23,23,23,23,23,23,23,23,23,23,23,23,22,23,23,23,22,23,23,23,22);

sf = 0; snext = 0;

now = new Date();
yyyy = now.getYear() + 1900;
mm = now.getMonth()+1;
dd = now.getDate();

YYYY1 = Math.floor(YYYY / 4);
YYYY2 = Math.floor(YYYY / 100);
YYYY3 = Math.floor(YYYY / 400);

if (YYYY != YYYY1 * 4) monthDay[1] = 28;
else
if (YYYY != YYYY2 * 100) monthDay[1] = 29;
else
if (YYYY != YYYY3 * 400) monthDay[1] = 28;
else monthDay[1] = 29;

leftUP = - YYYY - YYYY1 + YYYY2 - YYYY3;
if (monthDay[1] == 29) leftUP = leftUP + 1;

for (i = 0; i < MM - 1; i++){
leftUP = leftUP - monthDay[i];
}

leftUP1 = Math.ceil(leftUP / 7);
leftUP = leftUP - leftUP1 * 7;

document.write('<table border=1 cellspacing=0 bordercolor=white>');

document.write('<tr><td colspan=2 align=center>' + YYYY + '</td>');
document.write('<td colspan=5 align=right>' + monthName[MM - 1] + '</td></tr>');

document.write('<tr align=center><td><font color=red>日</font></td><td>月</td><td>火</td>');
document.write('<td>水</td><td>木</td><td>金</td><td><font color=blue>土</font></td></tr>');

for (y = 0; y < 6; y++){
document.write('<tr align=center>');

for (x = 0; x < 7; x++){
DD = leftUP + y * 7 + x + 1;
sf = 0;
if (MM == 1 && DD == 1) sf = 1;
else if (MM == 1 && x == 1 && DD >= 8 && DD <= 14) sf = 2;
else if (MM == 2 && DD == 11) sf = 3;
else if (MM == 3 && YYYY >= 2000 && YYYY <= 2020
&& DD == syunbun[YYYY - 2000]) sf = 4;
else if (MM == 4 && DD == 29) sf = 5;
else if (MM == 5 && DD == 3) sf = 6;
else if (MM == 5 && DD == 4) sf = 7;
else if (MM == 5 && DD == 5) sf = 8;
else if (MM == 7 && x == 1 && DD >= 15 && DD <= 21) sf = 9;
else if (MM == 9 && x == 1 && DD >= 15 && DD <= 21) sf = 10;
else if (MM == 9 && x == 2 && DD >= 16 && DD <= 22
&& YYYY >= 2000 && YYYY <= 2020
&& DD == syuubun[YYYY - 2000] - 1) sf = 16;
else if (MM == 9 && YYYY >= 2000 && YYYY <= 2020
&& DD == syuubun[YYYY - 2000]) sf = 11;
else if (MM == 10 && x == 1 && DD >= 8 && DD <= 14) sf = 12;
else if (MM == 11 && DD == 3) sf = 13;
else if (MM == 11 && DD == 23) sf = 14;
else if (MM == 12 && DD == 23) sf = 15;
else if (snext == 1) { snext = 0; document.write('<td bgcolor=deeppink><a href="' + document.URL + '" title="振替休日">'); }
else document.write('<td>');

if (sf >= 1) {
document.write('<td bgcolor=hotpink>');
document.write('<a href="' + document.URL + '" title="' + saijituNM[sf - 1] + '">');
}

投稿日時 - 2014-11-25 21:51:35

お礼

ソースまでご提示いただき感謝です。
プリントアウトして、読ませていただきます。

投稿日時 - 2014-11-26 07:01:28

使用条件ですが、
オンラインでカレンダー情報をゲットしてから使うことになると思うのですが、
その部分は、Googleで検索してもらう事にして、

私からの次の情報は、役に立ちそうなので書き込んでおきます。

http://blog.howdylikes.jp/entry/20120806/1344265078
https://developers.google.com/google-apps/calendar/

参考URL:http://blog.howdylikes.jp/entry/20120806/1344265078

投稿日時 - 2014-11-25 21:21:49

お礼

カレンダーAPIとは思いもつきませんでした。
非常に参考になりました。
APIの導入も検討しています。

投稿日時 - 2014-11-26 06:59:40

あなたにオススメの質問