エヴォエ暦
コアエ国成立当時、エヴォエで使われていた暦を持ってきて、ミリ風アレンジをした太陽太陰暦をいまでも使っている。エヴォエはとっくに太陽暦なのにね。
ミリの神様には太陽神(コミ)と太陰神(サメン)がいるからこっちの方が宗教的にいいらしい。
----
1〜12月。それぞれ30日と13月5〜6日(閏年のみ6)
----
地球太陽暦閏年は4で割りきれる年
エヴォエ暦でも同じ
----
地2011年9月8日=エ1718年1月1日
----
換算式考察
まず、太陽暦とは
○年
一年365日
閏年は4で割れる年
400で割れないけど100で割れる年は平年
○月日
お察しください
基準年月2000年1/1日(total=0)とする
2011/9/4は1717/13/2となる
2010/9/4は1716/13/3○
2009/9/4は1715/13/3○
2008/9/4は1714/13/3○
2007/9/4は1713/13/2
2006/9/4は1712/13/3○
2005/9/4は1711/13/3○
2004/9/4は1710/13/3○
2003/9/4は1709/13/2
2002/9/4は1708/13/3○
2001/9/4は1707/13/3○
2000/9/4は1706/13/3○
1999/9/4は1705/13/2
1999/9/7は1705/13/5
1999/9/8は1706/1/1
2004/1/1は1710/4/25
2003/1/1は1709/4/25
2002/1/1は1708/4/24
2001/1/1は1707/4/24
2000/1/1は1706/4/25
total=0のとき、出力されるデータは1706/04/25であればいいんだな。うん
○西暦→total
まず、ユーザーによる入力数値
地球太陽暦の年:sy 月:sm 日:sd
とする。(おかしな数字だったら計算を止めさせる。)
Javascriptでプログラムすることにする。
まずは、基準点2000年なので、sy-2000をする。
まずはsy+2000年1/1のtotalに加算する数値を出す
yplus=0;//これが後にtotalに加算される
for( i=sy; i=0 ; i--) {
if ((i+2000)%400=0){
yplus+=366;
} else if ((i+2000)%100=0){
yplus+=365;
} else if ((i+2000)%4=0){
yplus+=366;
} else {
yplus+=365;
}
}
次はmplusになるね
2は28or29
4,6,9,11は30
1,3,5,7,8,10,12は31
mplus=0;
for( i=sm-1; i=0 ; i--) {
if (i=2){
if ((sy+2000)&400=0){
mplus+=29;
}else if ((sy+2000)&100=0){
mplus+=28;
}else if ((sy+2000)&4=0{
mplus+=29;
}else{
mplus+=28;
}
}else if ((i=4)||(i=6)||(i=9)||(i=11)) {
mplus+=30;
}else if ((i=1)||(i=3)||(i=5)||(i=7)||(i=8)||(i=10)||(i=12)) {
mplus+=31;
}
}
日も合わせておく
dplus=sd;
んでtotal加算
total+=yplus+mplus+dplus;
○total→エヴォエ暦
ここがめんどくさい
一年が13月。1〜12月は30日。13月目は5日。閏年は6日。閏年は地球太陽暦と同じ年。
total=0のとき1706/04/25
?平年なら365引いてeyを1足す。閏年なら366引いてeyを1足す
?余りが366以上のとき、?に戻る。
while (total>=366){
if ((sy+2000)&400=0){
total-=366;
ey++;
}else if ((sy+2000)&100=0){
total-=365;
ey++;
}else if ((sy+2000)&4=0{
total-=366;
ey++;
}else{
total-=365;
ey++;
}
}
つぎは余った365以下の数字をどう処理するかだね。
30ずつ引いていくごとにemに1を足す。
30以下またはemは8より大になったら抜け出す。
em=0のとき、エ4/25なので、
em=8のとき、エ12/25。
while ((total>30)||(em<=8)) {
total-=30;
em++;
}
em<=8のとき、(totalは30以下)
totalが5以下のとき、
ed=total
ey+1706,em+4,ed+25 答え
totalが5より大のとき、
em<8のとき
total-=5
ed=total
ey+1706,em+5,ed 答え
em=8のとき
totalが6以上のとき
?ey+1706が平年のとき
total6以上10以下のとき、total-5,em=9,ed=total ey+1706,em+4,edが答え
total10より大きいのとき、total-=10して?へ
?ey+1706が閏年のとき
total6以上11以下のとき、total-5,em=9,ed=total ey+1706,em+4,edが答え
total11より大きいのとき、total-=11して?へ
?
ey++
em=-3
ey+1706,em+4,edが答え。
if (em<=8){
if (total<=5){
ed=total;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed+25)+"日")
}else{
if (em<8){
total-=5;
ed=total;
alert(""+(ey+1706)+"年"+(em+5)+"月"+(ed)+"日")
}else{
if (total>=6){
if ((ey+1706)&400=0){
if ((total>=6)||(total<=11)){
total-=5;
em=9;
ed=total;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if(total>11){
total-=11;
ey++;
em=-3;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}
}else if ((ey+1706)&100=0){
if ((total>=6)||(total<=10)){
total-=5;
em=9;
ed=total;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if(total>10){
total-=11;
ey++;
em=-3;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}
}else if ((ey+1706)&4=0{
if ((total>=6)||(total<=11)){
total-=5;
em=9;
ed=total;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if(total>11){
total-=11;
ey++;
em=-3;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}
}else{
if ((total>=6)||(total<=10)){
total-=5;
em=9;
ed=total;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if(total>10){
total-=11;
ey++;
em=-3;
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}
}
}
}
}
em>8のとき、(em=8でtotalが0になれば、12/25なので、それより30日以上たっている)
?ey+1706が平年のとき
total+=30,total-10する。(←合計でtotal+=20)。ey++,em=1して?へ
?ey+1706が閏年のとき
total+=30,total-11する。(←合計でtotal+=19)。ey++,em=1して?へ
?
totalがまだ30以上のときは、
30ずつ引いていくごとに、emに1を足す
30以下になったら、ed=totalして
ey+1706,em+4,edが答え。
if (em>8){
if ((ey+1706)&400=0){
total+=19;
ey++;
em=1;
while (total>30){
total-=30;
em++
}
ed=total
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if ((ey+1706)&100=0){
total+=20;
ey++;
em=1;
while (total>30){
total-=30;
em++
}
ed=total
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else if ((ey+1706)&4=0{
total+=19;
ey++;
em=1;
while (total>30){
total-=30;
em++
}
ed=total
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}else{
total+=20;
ey++;
em=1;
while (total>30){
total-=30;
em++
}
ed=total
alert(""+(ey+1706)+"年"+(em+4)+"月"+(ed)+"日")
}
}
おわた