KT*info

カウントパーツ配布サイト*KT*からのお知らせです
2017年07月 ≪  12345678910111213141516171819202122232425262728293031 ≫ 2017年09月
TOPスポンサー広告 ≫ 閏年の時、カウントはどうなるの?TOPQ&A ≫ 閏年の時、カウントはどうなるの?

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | Comments(-) | Trackbacks(-)

閏年の時、カウントはどうなるの?

今年は閏年だったので、「いくつになったの」では2月29日はカウントされるの?というご質問を複数いただきました。(回答に書かなかった部分も含めてブログネタに…)

答えはyes。
閏年の場合、2月は29日でカウントします。

また、誕生日が2月29日の場合はどうなるか?

これも問題なく、他の誕生日と同じようにカウントします。
閏年には、2月29日に「今日で○歳」「Happy Birthday!!」と表示しますが、平年ではそれが2月28日になります。
カウントダウンは、閏年は2月29日まで、平年は2月28日までの残日数を表示します。
誕生日はあくまで「29日」なので、生年月日は「○年2月29日生まれ」と表示されますし、「○歳1ヶ月」と表示されるのは「3月29日」です。


※余談ですが、「いくつになったの」での「1ヶ月」の数え方は、30日とか31日とか決まった日数ではなく、誕生日の日付になったら1ヶ月経過、となります。つまり2月20日生まれなら、3月20日で1ヶ月になります。当たり前か(笑)

では1月31日生まれの場合、「1ヶ月」はいつになるか?
2月28日には「○歳と28日」と表示されます。そして翌日の3月1日には、「○歳1ヶ月1日」になります。2月に31日がないので、この場合「1ヶ月ちょうど」という表示は出てきません。

「○ヶ月○日」の算出方法は、実はあまり単純ではないんですよね。
誕生月日と現在時刻の差を出せば、確かに日数はでるけど、それをどうやって何ヶ月何日に直すのかは考えどころ。
日数カウントのスクリプトはたくさんあるのに、○ヶ月○日表示が少ないのは、そのせいですよね。

私の場合、ひたすら条件分岐です。
今月が、誕生月の前か、後か。前なら年齢を1引く。
今日の日付が、誕生日の日付の前か、後か。前なら、○ヶ月から1引く。そんなローテクで。
…割り算でスマートにできる気がするんですけど( >Д<;)



閏年になる・ならないの条件ですが、現行のグレゴリオ暦では

・西暦が4で割り切れる年は閏年である。(いわゆるオリンピックイヤー)
・ただし、100で割り切れる年は閏年ではない。
・ただし、400で割り切れる年は閏年である。

となっています。(wikipediaからの受け売り。)

スクリプトでは、次のような閏年関数uruu()にしました。

function uruu(seireki){
var ur=0;
if (seireki%4==0){
if ((seireki%100!=0)||(seireki%400==0))ur=1;};
return(ur);
};


算出する年をseirekiに代入し、平年ならur→0、閏年ならur→1を返します。
結果、閏年なら

var num=new Array(31,31,29,31,30,31,30,31,31,30,31,30);


平年なら

var num=new Array(31,31,28,31,30,31,30,31,31,30,31,30);

で日数を算出。
でも、100や400で割り切れる年って、パソコン上では西暦2000年しかないんですよね。
うちのパソコン(XP)なんて1980年~2099年までしか表示しないし、このスクリプトを作ったのは2001年。前にご指摘を受けたので100と400も一応加えてあるんですけれど、あと92年も使われるつもりでいるような、おこがましい気がする(笑)

(あ、設計思想として重要なんだろうなと理解はしてるんですけど。2000年問題が起きたのって日時の期限が短すぎたせいでしたっけ?)

これを書いた後で、閏年と平年と両方の配列を用意するのは無駄だって気づいて、
その後は
var num=new Array(31,31,28,31,30,31,30,31,31,30,31,30);
if (uruu(ty)==1)num[2]=29;
としました。



ついでに、カウントダウンの処理は、次のようにやってます。(折角の機会なので覚書代わりにー)

var nbd=bd;
if (uruu((by+ys+1))==0){
if ((bm==2)&&(bd==29)) nbd=28;
};

まず、次に来る誕生日の西暦を(by+ys+1)で出してます。「生まれた年(by)+今の満年齢(ys)+1」。次に来る誕生日は今年かも知れないし、もう誕生日過ぎちゃって来年かも知れないので、「今年(ty)+1」ではダメで、このように算出してます。
で、それを先の閏年関数uruu()に代入して、次の誕生日が閏年かどうかを判定。
結果、平年だったら、翌年の誕生日は2月28日として(nbd=28)、カウントダウン計算する。
閏年だったら29日のままにする。(考え方単純ですね;)
関連記事
Q&A | Comments(-) | Trackbacks(-)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。