gettimeを使った秒数計測をやってみました。
若干精度が落ちますがそれほど厳密性は要らないだろうという希望的観測で
ミリ秒は無視しました。
時間だけならまだしも、実行中に年が変わる・月が変わる・日付をまたぐなどが絡むと
急激に面倒な処理になってしまうのが難点ですね。
特に各月の日数がバラバラなのがまた面倒なのと、うるう年がすごく邪魔に思えます。
そんな理由で少々長くなってしまいました。
dim monthdays, 13; // 各月の日数
monthdays = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;
// 開始日時を記録
startyear = gettime(0); // 年
startmonth = gettime(1); // 月
startday = gettime(3); // 日
starthour = gettime(4); // 時
startminute = gettime(5); // 分
startsecond = gettime(6); // 秒
// うるう年の確認
check_year = startyear;
gosub *check_leap;
// 開始年1月1日から開始月日までの日数…………①
startyeardays = 0;
repeat startmonth - 1, 1
startyeardays += monthdays(cnt);
if( cnt == 2 ) : startyeardays += leap;
loop
startyeardays += startday - 1;
// 開始日0時0分0秒から開始時間までの秒数…………④
startdayseconds = starthour*3600 + startminute*60 + startsecond;
*main
redraw 0;
color 255, 255, 255:boxf;
color 0, 0, 0:pos 0, 0;
gosub *count_time;
mes strf("開始日時\t%d/%02d/%02d %02d:%02d:%02d", startyear, startmonth, startday, starthour, startminute, startsecond);
mes strf("計測日時\t%d/%02d/%02d %02d:%02d:%02d", checkyear, checkmonth, checkday, checkhour, checkminute, checksecond);
mes "経過秒 = "+passseconds+"";
redraw 1;
await 17;
goto *main;
*count_time
// 計測日時を記録
checkyear = gettime(0); // 年
checkmonth = gettime(1); // 月
checkday = gettime(3); // 日
checkhour = gettime(4); // 時
checkminute = gettime(5); // 分
checksecond = gettime(6); // 秒
// 開始年1月1日から計測年1月1日までの日数…………②
SdayfToCdayf = 0;
repeat checkyear - startyear, startyear
check_year = cnt;
gosub *check_leap;
SdayfToCdayf += 365;
SdayfToCdayf += leap;
loop
// うるう年の確認
check_year = checkyear;
gosub *check_leap;
// 計測年1月1日から計測月日までの日数…………③
checkyeardays = 0;
repeat checkmonth - 1, 1
checkyeardays += monthdays(cnt);
if( cnt == 2 ) : checkyeardays += leap;
loop
checkyeardays += checkday - 1;
// ②+③-① = 経過日数
passdays = SdayfToCdayf + checkyeardays - startyeardays;
// 経過日数を秒に換算…………⑤
STCseconds = passdays * 24 * 60 * 60;
// 計測日0時0分0秒から計測時間までの秒数…………⑥
checkdayseconds = checkhour*3600 + checkminute*60 + checksecond;
// ⑤+⑥-④ = 経過秒数
passseconds = STCseconds + checkdayseconds - startdayseconds;
return;
// うるう年の確認
*check_leap
/*
うるう年の定義
・4で割り切れる年はうるう年
・100で割り切れる年はうるう年では無い
・400で割り切れる年はうるう年
*/
if( (((check_year\4) == 0) && ((check_year\100) != 0)) || ((check_year\400) == 0) ) {
leap = 1;
}
else {
leap = 0;
}
return;
あまり考えなくてもいいであろう問題ですが
int型で秒を算出している関係上、2038年問題と同様の理由で
合計時間が約68年以上になるとオーバーフローします。
更に同じ理由で(まずありえないでしょうが)
アプリの開始日時から68年以上実行しっぱなしにするとオーバーフローします。