〜 タイム 〜
基準日からの日数を取得

特定の日付を基準に、指定した日付まで何日間開いているかを求めるサンプルです。
コレを使うことで「○年△月□日は●年▲月■日の☆日後である」と求められる様になります。
間に2月を挟んでいる場合は閏年のチェックも行わなければなりませんが、
閏年かのチェックにはコチラと違って#defineマクロを使用しています。
コレにより、HSP2でも関数形式に記述することができますが、
文字列中においては、カッコを使用しての計算ができず、数式の中だけしか使用できません。
閏年の判定結果を文字列内にも入れる場合、一旦変数に代入するようにしてください。
尚、下記のサンプルでは、月末日を取得するモジュール命令・関数を使用していますが、
モジュール内の別命令で使用している訳ではないので、日数取得を行うためには必要ありません。
サンプルスクリプト内でランダムな年月を生成しており、月末を取得するために流用しています。
月末日を取得する命令・関数についてはコチラをご覧ください。
	

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

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

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

 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
59
#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 getlastday int, int
	if kijun = 0 : dateinit
	mref year, 0 : mref month, 1
	mref stt, 64
	stt = (month = 2) * leapchk(year) + days.month
	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
#global

	randomize
	dim date, 6
	repeat 20
		if cnt \ 4 = 0 {
			date.0 = 2004
			rnd date.1, 12 : date.1++
			getlastday date.0, date.1 : rnd date.2, stat : date.2++
			dateinit date.0, date.1, date.2
		}
		date.3 = 2004
		rnd date.4, 12 : date.4++
		getlastday date.3, date.4 : rnd date.5, stat : date.5++
		getdays date.3, date.4, date.5
		pos  10, cnt * 20 + 10 : mes "" + date.0 + "/" + date.1 + "/" + date.2
		pos  90, cnt * 20 + 10 : mes "を基準とした "
		pos 200, cnt * 20 + 10 : mes "" + date.3 + "/" + date.4 + "/" + date.5
		pos 290, cnt * 20 + 10 : mes "までの日数は"
		pos 400, cnt * 20 + 10 : mes stat
	loop
	stop

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

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

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

 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
#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 getlastday int year, int month
	if kijun = 0 : dateinit
	return leapchk(year) * (month = 2) + days.month

#defcfunc getdays int year, int month, int day, local i
	if kijun = 0 : dateinit
	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
#global

	randomize
	dim date, 6
	repeat 20
		if cnt \ 4 = 0 {
			date.0 = 2004, rnd(12) + 1
			date.2 = rnd(getlastday(date.0, date.1)) + 1
			dateinit date.0, date.1, date.2
		}
		date.3 = 2004, rnd(12) + 1
		date.5 = rnd(getlastday(date.3, date.4)) + 1
		pos  10, cnt * 20 + 10 : mes "" + date.0 + "/" + date.1 + "/" + date.2
		pos  90, cnt * 20 + 10 : mes "を基準とした	"
		pos 200, cnt * 20 + 10 : mes "" + date.3 + "/" + date.4 + "/" + date.5
		pos 290, cnt * 20 + 10 : mes "までの日数は"
		pos 400, cnt * 20 + 10 : mes getdays(date.3, date.4, date.5)
	loop