〜 タイム 〜
指定日付が何週目か確認

元日のある週を1週目とすると、指定した日付が何週目になるかを求めるサンプルです。
1月1日から何日開いているかを求めて、1月1日が何曜日かを取得さえすれば何週目かを求められるので、
コチラコチラのモジュールを利用して取得してみましょう。
	

dateinit 基準年, 基準月, 基準日
基準年日付計算用の基準とする年を指定する。
基準月日付計算用の基準とする月を指定する。
基準日日付計算用の基準とする日を指定する。

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

getdays 対象年, 対象月, 対象日
対象年求めたい対象年を指定する。>尚、取得した日数はstatに返る。
内部でdateinit命令を使用しているため、getdaysより前にdateinit命令を定義すること。
対象月求めたい対象月を指定する。
対象日求めたい対象日を指定する。

weeknum 対象年, 対象月, 対象日
対象年求めたい対象週位置の年を指定する。尚、取得した週数はstatに返る。
内部でdateinit命令、weekday命令、getdays命令を使用しているため、
weeknum命令より前にdateinit命令、weekday命令、getdays命令を定義すること。
対象月求めたい対象週位置の月を指定する。
対象日求めたい対象週位置の日を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define global ctype leapchk(%1 = 1900) ((%1 \ 400 = 0) | ((%1 \ 4 = 0) & (%1 \ 100 ! 0)))
#module
#deffunc dateinit int , int, int
	mref year, 0 : mref month, 1 : mref day, 2
	days = 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
	kijun = year, month, day
	if year = 0 : kijun = 1900
	return

#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

#deffunc getdays int , int, int
	if kijun = 0 : dateinit
	mref year, 0 : mref month, 1 : mref day, 2
	mref stt, 64
	i = 0
	if year - kijun < 0 {
		repeat kijun - year, year : i -= days + leapchk(cnt) : loop
		if kijun.1 > 2 & leapchk(kijun) = 1 : i--
	} else {
		repeat year - kijun, kijun : i += days + leapchk(cnt) : loop
		if kijun.1 > 2 & leapchk(kijun) = 1 : i--
	}
	 if month - kijun.1 < 0 {
		repeat kijun.1 - month, month : j = cnt \ 12 : i -= days.j : loop
		if month > 2 & leapchk(year) = 1 : i++
	} else {
		repeat month - kijun.1, kijun.1 : j = cnt \ 12 : i += days.j : loop
		if month > 2 & leapchk(year) = 1 : i++
	}
	stt = i + (day - kijun.2)
 return

#deffunc weeknum int, int, int
	mref y, 0 : mref m, 1 : mref d, 2
	mref stt, 64
	dateinit y, 1, 1
	weekday y, 1, 1
	w = stat
	getdays y, m, d
	stt = (w + stat) / 7 + 1
	return
#global

	randomize 2
	repeat 10
		rnd r.0, 200 : r.0 += 1900
		rnd r.1,  12 : r.1++
		rnd r.2,  28 : r.2++
		weeknum r, r.1, r.2
		mes "" + r + "年" + r.1 + "月" + r.2 + "日は" + stat + "週目です"
	loop
	stop

dateinit 基準年, 基準月, 基準日
基準年日付計算用の基準とする年を指定する。
基準月日付計算用の基準とする月を指定する。
基準日日付計算用の基準とする日を指定する。

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

日数 = getdays(対象年, 対象月, 対象日)
日数取得した日数の受取先を指定する。
尚、内部でdateinit命令を使用しているため、getlastdayより前にdateinit命令を定義すること。
対象年求めたい対象年を指定する。
対象月求めたい対象月を指定する。
対象日求めたい対象日を指定する。

週数 = weeknum(対象年, 対象月, 対象日)
週数取得した週数の受取先を指定する。
尚、内部でdateinit命令、weekday命令、getdays命令を使用しているため、
weeknum命令より前にdateinit命令、weekday命令、getdays命令を定義すること。
対象年求めたい対象週位置の年を指定する。
対象月求めたい対象週位置の月を指定する。
対象日求めたい対象週位置の日を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define global ctype leapchk(%1 = 1900) ((%1 \ 400 = 0) | ((%1 \ 4 = 0) & (%1 \ 100 ! 0)))
#module
#deffunc dateinit int year, int month, int day
	days = 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
	kijun = year, month, day
	if year = 0 : kijun = 1900
	return

#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

#defcfunc getdays int year, int month, int day, local i
	if year - kijun < 0 {
		repeat kijun - year, year : i -= days + leapchk(cnt) : loop
		if kijun.1 > 2 & leapchk(kijun) = 1 : i--
	} else {
		repeat year - kijun, kijun : i += days + leapchk(cnt) : loop
		if kijun.1 > 2 & leapchk(kijun) = 1 : i--
	}
	if month - kijun.1 < 0 {
		repeat kijun.1 - month, month : i -= days(cnt \ 12) : loop
		if month > 2 & leapchk(year) = 1 : i++
	} else {
		repeat month - kijun.1, kijun.1 : i += days(cnt \ 12) : loop
		if month > 2 & leapchk(year) = 1 : i++
	}
	i += (day - kijun.2)
	return i

#defcfunc weeknum int year, int month, int day, local i
	dateinit year, 1, 1
	i.0 = weekday(year, 1, 1)
	i.1 = getdays(year, month, day)
	return (i.0 + i.1) / 7 + 1
#global

	randomize
	repeat 10
		r = rnd(200) + 1900, rnd(12) + 1, rnd(28) + 1
		mes strf("%d年", r) + strf("%02d月", r.1) + strf("%02d日", r.2) + "は" + weeknum(r, r.1, r.2) + "週目です"
	loop