dポイントプレゼントキャンペーン実施中!

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

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

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

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

よろしくお願いします。

A 回答 (6件)

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

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

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

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

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

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

お礼日時:2014/11/26 20:09

APIを駆使したとしても


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

正確には「日本国の法令を見てください」となります。


http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.h …
> 第3条
> 2.「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。


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

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

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

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

お礼日時:2014/11/26 07:04

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>
    • good
    • 1

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] + '">');
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/26 07:01

使用条件ですが、


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

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

http://blog.howdylikes.jp/entry/20120806/1344265 …
https://developers.google.com/google-apps/calend …

参考URL:http://blog.howdylikes.jp/entry/20120806/1344265 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/26 06:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!