月の日数は決まってるから
現在日時からなら地道に計算すれば出来るけど
おもしろくないので・・・
#module
//1年1月1日からグレゴリウス暦で総日数計算。
///////年月日を経日数に変換
//総日数 = GetDays( y, m, d)
// y=年変数(入出)
// m=月変数(入出)
// d=日変数(入出)
//有り得ない日付を指定すると正しい日付に修正される(はず)
#defcfunc GetDays var y,var m,var d
if m<3 {y-1:m+12}//二月以下の場合12月加算して1年減らす(これは月日から日数を計算する式に必要な処理)
_tds=365*(y-1)+((m * 979 - 1033) >> 5)+(y/4)-(y/100)+(y/400)+d
GetYMD _tds, y, m, d
return _tds
///////総日数を年月日に変換
//GetYMD tds, y, m, d
// tds=総日数(入)
// y=年変数(出)
// m=月変数(出)
// d=日変数(出)
//statに曜日データとして0〜6が返る(0が日曜日)
#deffunc GetYMD double tds,var y,var m,var d
y=int(tds/365.2425)+1 //総日数を年平均日数で割って年数を出す
y-=((int(tds)-365.2425*(y-1))=0) //総日数が平均日数で割り切れると0日が出来てしまうので1年戻す
ly=GetLeapyear(y) //通常は閏年だが100で割り切れて400で割り切れない年は平年とする
ds=int(tds)-365.2425*(y-1) //総日数からy-1年分の日数を引いて一年以下の日数を出す
if ds<=(59+ly) {//二月以下の月と日付処理
if ds>31 {m=2:d=ds-31}else{m=1:d=ds}
}else{
if ly {ds-ly}//閏年だと計算が狂うので一日引いて平年と同じにする
m=(ds*32+1033)/979 //3〜12月を算出
d=ds-((m * 979 - 1033) >> 5) //月分の日数を引いて日付を算出
}
return int(tds)\7
///////閏年かを返す
//変数 = GetLeapyear( y )
// y=年(入)
//0なら平年、1なら閏年
#defcfunc GetLeapyear int y
return (((y\4)=0) ^ ((y\100)=0)) | ((y\400)=0)
///////日付と曜日から何週目かを返す
//変数 = GetWeeks( d, w )
// d=日付(入)
// w=曜日(入)
//初週は0になる
#defcfunc GetWeeks int d,int w
return (((((w+35)-(d-1))\7)+d-1)/7)
#global
screen 0,900,500
week="日","月","火","水","木","金","土"
Year=gettime(0)
Month=gettime(1)
DayOfWeek=gettime(2)
Day=gettime(3)
objmode 2
pos 32,5
input Year,40,20
y_id=stat
pos 32+48,5
input Month,24,20
m_id=stat
pos 32+48+24,5
input Day,24,20
d_id=stat
pos 32+48+24+30,5
mes week(DayOfWeek)+"曜日"
pos 32,32
add_Day=1
input add_Day,64,20
button "更新",*Update
title "現在 "+(Year)+" "+Month+"月 "+Day+"日 "+week(DayOfWeek)+"曜日"
*Update
gradf 0,0,900,500,0,$ffffff,$ffffff
TotalDays=GetDays(Year,Month,Day)
DayOfWeek=TotalDays\7 //総日数を7で割った余りが曜日になる(0が日曜日)
objprm y_id,Year
objprm m_id,Month
objprm d_id,Day
pos 32+48+24+30,5
mes week(DayOfWeek)+"曜日"
//おまけのカレンダー表示
y=Year
m=1
d=1
Calendar=GetDays(y,m,d)
pos 320,0
color 100,100,255
mes str(y)+"年"
repeat
GetYMD Calendar,y,m,d
w=stat //曜日
if y ! Year {break}
if d=1{
pos 320+((m-1)\3)*180,((m-1)/3)*125+20
color 255,0,255
mes str(m)+"月"
}
pos 350+w*20+((m-1)\3)*180,((m-1)/3)*125+GetWeeks(d,w)*20+20
color 255*(w=0)
mes d
Calendar++
loop
//カレンダーここまで
color 255
pos 350+DayOfWeek*20+((Month-1)\3)*180,((Month-1)/3)*125+GetWeeks(Day,DayOfWeek)*20+20
mes "○" //開始日(カレンダーにマーク)
pos 32,80
mes "開始日"+(Year)+"年"+Month+"月"+Day+"日 "+week(DayOfWeek)+"曜日"
color
repeat 20,add_Day
tds=TotalDays+cnt
GetYMD tds,Year2,Month2,Day2
w=stat
mes str(cnt)+"日後は"+(Year2)+"年"+(Month2)+"月"+Day2+"日 "+week(w)+"曜日"
//カレンダー側にマーク
posx=350+w*20+((Month2-1)\3)*180
posy=((Month2-1)/3)*125+GetWeeks(Day2,w)*20+20
circle posx,posy,posx+18,posy+18,0
loop
stop