〜 タイム 〜
日時各要素を連結したテキストに変換

配列に格納した年月日等の日時情報を連結して1つのテキストにするモジュールです。
HSP3にあるstrf関数のように「%」に続く書式指定文字列を指定することで、
「2010/06/29-15:30:42」や「2010年06月29日 火曜日 09時57分03.777秒」のような単純な日時連結の他、
月や曜日の出力形式を変換することでRSS2.0で使われているRFC822形式等にも対応できます。
指定文字列とオプションは次の通りです。
文字意味
%y配列要素0の年を返します。
%mo配列要素1の月を返します。
%w配列要素2の曜日を表す語を返します。
%d配列要素3の日を返します。
%h配列要素4の時を返します。
%mi配列要素5の分を返します。
%s配列要素6の秒を返します。
%ms配列要素7のミリ秒を返します。
オプション意味と例
+1前ゼロを付けず、桁揃えを行いません。(06 ⇒ 6)
+2年は4桁ではなく、下2桁のみを返します。(2010 ⇒ 10)
+4月は数字ではなく、月を表す英単語で返します。(06 ⇒ June)
+8曜日は漢字ではなく、英単語で返します。(火 ⇒ Tue)
+16英単語は略名ではなく、正式名で返します。(Tue ⇒ Tuesday)

dateformat 書式文字列, 日時配列, オプション
書式文字列変換したい書式を指定する。
%yは年、%moは月、%wは曜、%dは日、%hは時、%miは分、%sは秒、%msはミリ秒に変換される。
尚、書式付日時文字列はrefstrに代入される。
日時配列変換元の数値を入れた配列変数(0:年 1:月 2:曜 3:日 4:時 5:分 6:秒 7:ミリ秒)を指定する。
オプション書式変換時の以下のオプションを指定する。
+1桁揃えの前ゼロを付けない
+2下2桁のみの年を返す
+4英単語で月を返す
+8英単語で曜日を返す
+16英単語は正式名で返す

 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
60
63
#module
#deffunc dateformat str, val, int
	sdim fmt, 4, 9
	sdim month, 10, 12
	sdim week, 10, 7
	mref format, 32 : mref date, 49 : mref option, 2
	mref rstr, 65
	fmt = "%y", "%mo", "%w", "%d", "%h", "%mi", "%s", "%ms"
	if option & 4 {
		if option & 16 {
			month.0 = "January", "February", "March", "April", "May", "June"
			month.6 = "July", "August", "September", "October", "November", "December"
		} else {
			month = "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
		}
	}
	if option & 8 {
		if option & 16 {
			week = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
		} else {
			week = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
		}
	} else {
		week = "日", "月", "火", "水", "木", "金", "土"
	}
	rstr = format
	i.1 = 0
	repeat 9
		instr i.1, rstr, fmt.cnt, i.1
		if i.1 ! -1 {
			strlen i.2, fmt.cnt
			strlen i.3, rstr
			if option & 1 : s = "" + date.cnt : i = 4 : else : s = "00" + date.cnt
			if cnt = 0 & (option & 2 = 0) : i = 4 : else : if cnt = 7 : i = 3 : else : i = 2
			strmid s, s, -1, i
			if cnt = 1 & (option & 4 ! 0) : i = date.cnt - 1 : s = month.i
			if cnt = 2 : i = date.cnt : s = week.i
			strmid s1, rstr, , i.1
			strmid s2, rstr, i.1 + i.2, i.3 - i.1 - i.2
			rstr = s1 + s + s2
			continue cnt
		}
		i.1 = 0
	loop
	return
#global

	repeat
		repeat 8 : gettime now.cnt, cnt : loop
		redraw 0
		color 255, 255, 255 : boxf : color
		pos 0, 0
		dateformat "%y/%mo/%d %h:%mi:%s.%ms", now
		mes refstr
		dateformat "%y年%mo月%d日(%w曜) %h時%mi分%s秒", now, 1
		mes refstr
		dateformat "%w, %d-%mo-%y %h:%mi:%s", now, 2 + 4 + 8
		mes refstr
		redraw 1
		wait 5
	loop

受取先 = dateformat(書式文字列, 日時配列, オプション)
受取先書式付日時文字列の受取先を指定する。
書式文字列変換したい書式を指定する。
%yは年、%moは月、%wは曜、%dは日、%hは時、%miは分、%sは秒、%msはミリ秒に変換される。
日時配列変換元の数値を入れた配列変数(0:年 1:月 2:曜 3:日 4:時 5:分 6:秒 7:ミリ秒)を指定する。
オプション書式変換時の以下のオプションを指定する。
+1桁揃えの前ゼロを付けない
+2下2桁のみの年を返す
+4英単語で月を返す
+8英単語で曜日を返す
+16英単語は正式名で返す

 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
#module
#defcfunc dateformat str format, array date, int option, local i, local s, local rstr, local fmt
	fmt = "%y", "%mo", "%w", "%d", "%h", "%mi", "%s", "%ms"
	if option & 4 {
		if option & 16 {
			month.0 = "January", "February", "March", "April", "May", "June"
			month.6 = "July", "August", "September", "October", "November", "December"
		} else {
			month = "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
		}
	}
	if option & 8 {
		if option & 16 {
			week = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
		} else {
			week = "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
		}
	} else {
		week = "日", "月", "火", "水", "木", "金", "土"
	}
	rstr = format
	foreach fmt
		i = instr(rstr, , fmt.cnt)
		if i ! -1 {
			i.1 = strlen(fmt.cnt)
			if option & 1 : s = str(date.cnt) : else : s = strf("%02d", date.cnt)
			if cnt = 0 & (option & 2) ! 0 : s = strmid(s, -1, 2)
			if cnt = 1 & (option & 4) ! 0 : s = month(date.cnt - 1)
			if cnt = 2 : s = week(date.cnt)
			if cnt = 7 & (option & 1) = 0 : s = strf("%03d", date.cnt)
			rstr = strmid(rstr, 0, i) + s + strmid(rstr, i + i.1, strlen(rstr) - i - i.1)
			continue cnt
		}
	loop
	return rstr
#global

	repeat
		repeat 8 : now.cnt = gettime(cnt) : loop
		redraw 0
		color 255, 255, 255 : boxf : color
		pos 0, 0
		mes dateformat("%y/%mo/%d %h:%mi:%s.%ms", now)
		mes dateformat("%y年%mo月%d日(%w曜) %h時%mi分%s秒", now, 1)
		mes dateformat("%w, %d-%mo-%y %h:%mi:%s", now, 2 + 4 + 8)
		redraw 1
		wait 5
	loop