〜 タイム 〜
指定日付の曜日を取得

現在日付とその曜日を基準に、指定日付までの日数を算出することで指定した日付の曜日を求められますが、
1887年にツェラー(ドイツの牧師)が発表したツェラーの公式を使用することでも求めることが可能です。
尚、グレグリオ暦施行以降の1582年10月15日でなければ有効でないルーチンであり、
モジュールでは無視してますが、指定年の条件として「1583 <= 年 <= 3999」が設けられています。
下限の1583はグレゴリオ暦制定以後を指しているものと思われますが、
上限の3999は謎です。4000年で周期変動により公式が成り立たなくなるとか…?
また、条件としてもう1つ。
年の初めを3月として変動する閏月(2月)を年度末と考えているようで、
公式に当てはめるには事前に「1月を前年13月」「2月を前年14月」としてください。
無事に取得ができると、gettime命令・関数と同じく、日曜を0として土曜を6とした数値で返ります。
	

weekday 対象年, 対象月, 対象日
対象年求めたい対象年を指定する。
苗、取得した曜日はstatに代入される。
対象月求めたい対象月を指定する。
対象日求めたい対象日を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#module
#deffunc weekday int, int, int
	mref year, 0 : mref month, 1 : mref day, 2
	mref stt, 64
	i = year - (month <= 2 * month), month + (month <= 2 * 12)
	stt = i.0 + (i.0 / 4) - (i.0 / 100) + (i.0 / 400) + (i.1 * 13 + 8 / 5) + day \ 7
	return
#global

	randomize
	sdim ws, 4, 7
	ws = "日", "月", "火", "水", "木", "金", "土"
	repeat 10
		rnd date.0, 10 : date.0 += 2000
		rnd date.1,  12 : date.1++
		date.2 = 1
		weekday date, date.1, date.2
		mes "" + date.0 + "年" + date.1 + "月" + date.2 + "日は" + ws.stat + "曜日です"
	loop
	stop

曜日 = weekday(対象年, 対象月, 対象日)
曜日取得した曜日の受取先を指定する。
対象年求めたい対象年を指定する。
対象月求めたい対象月を指定する。
対象日求めたい対象日を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#module
#defcfunc weekday int year, int month, int day, local i
	i = year - (month <= 2) * month, month + (month <= 2) * 12
	return (i.0 + i.0 / 4 - i.0 / 100 + i.0 / 400 + (i.1 * 13 + 8) / 5 + day) \ 7
#global

	randomize
	sdim ws, 4, 7
	ws = "日", "月", "火", "水", "木", "金", "土"
	repeat 10
		date = rnd(100) + 1950, rnd(12) + 1, 1
		mes "" + date.0 + "年" + date.1 + "月" + date.2 + "日は" + ws(weekday(date, date.1, date.2)) + "曜日です"
	loop