〜 タイム 〜
パソコンの日時を変更 (要KERNEL32.DLL)

HSPには日時を取得するgettime命令または関数が存在しますが、
取得に比べて用途の少ない設定を行える命令または関数は用意されていませんので、
日時の設定を行うにはAPI関数SetLocalTimeを使用しましょう。
API関数SetLocalTimeに指定する引数はコチラで紹介している日時情報を格納したSYSTEMTIME構造体です。
API関数名の通り、ローカルタイムを変更するものになるのでタイムゾーンを考慮する必要はありません。
指定した日時がそのまま設定される形になります。

下記のサンプルを実行するとパソコンの現在日時を変更します。
この処理はHSPを終了させても自動的には元に戻らないので変更する際は気をつけてください。
時間だけでなく日付も変更するとインターネット時刻サーバーと同期させられなくなるかもしれません。
その際は日付だけ手入力で実際の現在日付に修正してから時刻を取得するようにしてください。

	

tm2st 格納先, 年, 月, 日, 時, 分, 秒, ミリ秒
格納先日付情報を格納しておく数値型配列変数を指定する。
正常に指定していると、SYSTEMTIME型として使用可能。
格納する年を指定する。省略すれば現時点の年となる。
格納する月を指定する。省略すれば現時点の月となる。
格納する日を指定する。省略すれば現時点の日となる。
格納する時を指定する。省略すれば現時点の時となる。
格納する分を指定する。省略すれば現時点の分となる。
格納する秒を指定する。省略すれば現時点の秒となる。
ミリ秒格納するミリ秒を指定する。省略すれば現時点のミリ秒となる。

settime 年, 月, 日, 時, 分, 秒
変更後の年を指定する。省略すれば現時点の年となる。
尚、内部でtm2st命令を使用しているため、settime命令よりも前にtm2st命令を定義すること。
変更後の月を指定する。省略すれば現時点の月となる。
変更後の日を指定する。省略すれば現時点の日となる。
変更後の時を指定する。省略すれば現時点の時となる。
変更後の分を指定する。省略すれば現時点の分となる。
変更後の秒を指定する。省略すれば現時点の秒となる。

 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
	ll_libload kernel, "kernel32.dll"
	ll_getproc SetLocalTime, "SetLocalTime", kernel

#module
#deffunc tm2st val, int, int, int, int, int, int, int
	mref tm, 48 : mref y, 1 : mref m, 2 : mref d, 3 : mref h, 4 : mref mi, 5 : mref s, 6 : mref ms, 7
	if y = 0 : gettime y, 0
	if m = 0 : gettime m, 1
	if d = 0 : gettime d, 3
	if h = 0 & (mi = 0) & (s = 0) & (ms = 0) : gettime h, 4 : gettime mi, 5 : gettime s, 6 : gettime ms, 7
	wpoke tm.0, 0, y
	wpoke tm.0, 2, m
	wpoke tm.1, 2, d
	wpoke tm.2, 0, h
	wpoke tm.2, 2, mi
	wpoke tm.3, 0, s
	wpoke tm.3, 2, ms
	return

#deffunc settime int, int, int, int, int, int, int
	mref y, 0 : mref m, 1 : mref d, 2 : mref h, 3 : mref mi, 4 : mref s, 5 : mref ms, 6
	mref stt, 64
	dim st, 4
	tm2st st, y, m, d, h, mi, s, ms
	ll_getptr st : ll_ret prm
	ll_callfunc prm, 1, SetLocalTime@
	ll_ret prm : stt = prm
	return
#global

	dim now, 8
	pos  10, 10 : input now.0, 40, 20, 4
	pos  75, 10 : input now.1, 25, 20
	pos 120, 10 : input now.3, 25, 20
	pos 170, 10 : input now.4, 25, 20
	pos 220, 10 : input now.5, 25, 20
	pos 270, 10 : input now.6, 25, 20
	pos 350, 10 : button "変更", *set
	pos 420, 10 : button "取得", *get
	pos  50, 13 : mes "年  月  日   時  分  秒"

*get
	repeat 7 : gettime now.cnt, cnt : loop
	repeat 6 : i = cnt + (cnt >= 2) : objprm cnt, now.i : loop
	stop

*set
	settime now.0, now.1, now.3, now.4, now.5, now.6
	if stat : dialog "変更しました" : else : dialog "変更に失敗しました", 1
	stop

tm2st 格納先, 年, 月, 日, 時, 分, 秒, ミリ秒
格納先日付情報を格納しておく数値型配列変数を指定する。
正常に指定していると、SYSTEMTIME型として使用可能。
格納する年を指定する。省略すれば現時点の年となる。
格納する月を指定する。省略すれば現時点の月となる。
格納する日を指定する。省略すれば現時点の日となる。
格納する時を指定する。省略すれば現時点の時となる。
格納する分を指定する。省略すれば現時点の分となる。
格納する秒を指定する。省略すれば現時点の秒となる。
ミリ秒格納するミリ秒を指定する。省略すれば現時点のミリ秒となる。

settime 年, 月, 日, 時, 分, 秒
変更後の年を指定する。省略すれば現時点の年となる。
尚、内部でtm2st命令を使用しているため、settime命令よりも前にtm2st命令を定義すること。
変更後の月を指定する。省略すれば現時点の月となる。
変更後の日を指定する。省略すれば現時点の日となる。
変更後の時を指定する。省略すれば現時点の時となる。
変更後の分を指定する。省略すれば現時点の分となる。
変更後の秒を指定する。省略すれば現時点の秒となる。

 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
#uselib "kernel32.dll"
#cfunc global SetLocalTime "SetLocalTime" var

#module
#deffunc tm2st array tm, int y, int m, int d, int h, int mi, int s, int ms
	wpoke tm.0, 0, (y = 0) * gettime(0) + y
	wpoke tm.0, 2, (m = 0) * gettime(1) + m
	wpoke tm.1, 2, (d = 0) * gettime(3) + d
	wpoke tm.2, 0, (h = 0 & mi = 0 & s = 0 & ms = 0) * gettime(4) + h
	wpoke tm.2, 2, (h = 0 & mi = 0 & s = 0 & ms = 0) * gettime(5) + mi
	wpoke tm.3, 0, (h = 0 & mi = 0 & s = 0 & ms = 0) * gettime(6) + s
	wpoke tm.3, 2, (h = 0 & mi = 0 & s = 0 & ms = 0) * gettime(7) + ms
	return

#deffunc settime int y, int m, int d, int h, int mi, int s, int ms, local st
	dim st, 4
	tm2st st, y, m, d, h, mi, s, ms
	return SetLocalTime(st)
#global

	dim now, 8
	pos  10, 10 : input now.0, 40, 20, 4
	pos  80, 10 : input now.1, 20, 20
	pos 120, 10 : input now.3, 20, 20
	pos 170, 10 : input now.4, 20, 20
	pos 220, 10 : input now.5, 20, 20
	pos 270, 10 : input now.6, 20, 20
	pos 350, 10 : button gosub "変更", *set
	pos 420, 10 : button gosub "取得", *get
	pos  50, 13 : mes "年  月  日  時  分  秒"
	gosub *get
	stop

*get
	repeat 7 : now.cnt = gettime(cnt) : loop
	repeat 6 : objprm cnt, now(cnt + (cnt >= 2)) : loop
	return

*set
	settime now.0, now.1, now.3, now.4, now.5, now.6
	if stat : dialog "変更しました" : else : dialog "変更に失敗しました", 1
	return