注意:これは「超」簡易計算です。ここで算出した日の出までの秒数は数分のズレがあります
ある地点の日の出、日の入りの時間を月毎に取得したので表っぽくしておく
カッコ内は0:00からの経過秒数
日付 日の出 日の入
---- ----------- ------------
1/1 6:54(24840) 16:29(59340)
2/1 6:42(24120) 17:01(61260)
3/1 6:07(22020) 17:34(63240)
4/1 5:19(19140) 18:05(65100)
5/1 4:36(16560) 18:35(66900)
6/1 4:09(14940) 19:03(68580)
7/1 4:11(15060) 19:13(69180)
8/1 4:34(16440) 18:54(68040)
9/1 5:03(18180) 18:12(65520)
10/1 5:31(19860) 17:24(62640)
11/1 6:02(21720) 16:40(60000)
12/1 6:35(23700) 16:19(58740)
LRA1のインタラクティブモードで
? datetime(clock)
24/06/18 09:14:35
OK
と返ってくる
「LRA1_ソフトウェアリファレンスマニュアル」によると
TOINT(文字列 [、[オフセット] [、[文字数]]]) 文字列中の指定部分を数値に変換
とのこと
左記の ’24/06/18 09:14:35’ の中の '06' と '18' を「整数として」抜き出す
? toint(datetime(clock), 3,2)
6
? toint(datetime(clock), 6,2)
18
それぞれ整数で取れる
'09:14:35' の '09' '14' '35'を「整数として」抜き出して本日0時からの経過秒数算出
? toint(datetime(clock),9,2)*3600 + toint(datetime(clock),12,2)*60 + toint(datetime(clock),15,2)
33275
OK
ここまでを踏まえて BASICで書いてみる
10 Gosub _until_sunrise_time
20 If I>0 Then
21 '算出値取得した
22 '日の出までSleepしたり日の出から晴れるのが分かっている場合は少し早く稼働したり
30 Print "until_sunrise_time ";I
40 Else
41 ' エラーだろう
50 Print "NOP ";I
60 EndIf
999 End
10000 ' 次の日の出までの秒数Iを返却する 0はエラー 変数IJN使用
10002 ' 毎月1日~9日 :1日の日の出時刻までの秒数算出
10003 ' 毎月10日~20日:(今月1日と次月1日の中間時刻までの秒数算出
10004 ' 毎月21以降 :翌月1日の日の出時刻までの秒数算出
10010 _until_sunrise_time
10020 N=ToInt( Datetime (Clock),3,2)
10040 '0時から現在までの経過秒数
10050 I=ToInt( Datetime (Clock),9,2)*3600+ToInt( Datetime (Clock),12,2)*60+ToInt( Datetime (Clock),15,2)
10060 ' 下記 ToInt( Datetime (Clock),6,2)<10 Then は上旬 Elseif ToInt( Datetime (Clock),6,2)>20 Then は下旬 Elseは中旬
10070 If N=1 Then If ToInt( Datetime (Clock),6,2)<10 Then J=24840 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=24120 Else J=24480 EndIf
10080 ElseIf N=2 Then If ToInt( Datetime (Clock),6,2)<10 Then J=24120 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=22020 Else J=23070 EndIf
10090 ElseIf N=3 Then If ToInt( Datetime (Clock),6,2)<10 Then J=22020 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=19140 Else J=20580 EndIf
10100 ElseIf N=4 Then If ToInt( Datetime (Clock),6,2)<10 Then J=19140 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=16560 Else J=17850 EndIf
10110 ElseIf N=5 Then If ToInt( Datetime (Clock),6,2)<10 Then J=16560 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=14940 Else J=15750 EndIf
10120 ElseIf N=6 Then If ToInt( Datetime (Clock),6,2)<10 Then J=14940 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=15060 Else J=15000 EndIf
10130 ElseIf N=7 Then If ToInt( Datetime (Clock),6,2)<10 Then J=15060 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=16440 Else J=15750 EndIf
10140 ElseIf N=8 Then If ToInt( Datetime (Clock),6,2)<10 Then J=16440 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=18180 Else J=17310 EndIf
10150 ElseIf N=9 Then If ToInt( Datetime (Clock),6,2)<10 Then J=18180 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=19860 Else J=19020 EndIf
10160 ElseIf N=10 Then If ToInt( Datetime (Clock),6,2)<10 Then J=19860 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=21720 Else J=20790 EndIf
10170 ElseIf N=11 Then If ToInt( Datetime (Clock),6,2)<10 Then J=21720 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=23700 Else J=22710 EndIf
10180 ElseIf N=12 Then If ToInt( Datetime (Clock),6,2)<10 Then J=23700 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=24840 Else J=24270 EndIf
10190 Else
10200 I=0:Return
10210 EndIf
10220 '下記 I>28800 Then I=J+(86400-I) は0時前の場合の補正
10230 If I>28800 Then I=J+(86400-I) Else I=J-I EndIf
19999 Return
テストが足りないかもしれません。流用する際は十分検証してください
そもそもClock値はズレ進んでしまうのでこんな大雑把な計算にしました
0 件のコメント:
コメントを投稿