HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0512
Y_repeat時刻に関する質問19解決


Y_repeat

リンク

2018/5/12(Sat) 14:53:29|NO.84326

自分、前回のコンテストでTOOL集を投稿して
何個か時刻管理のTOOLを作成したんですけど
よくわかってないままのやっつけで
最近別スレッドを読んでて
http://hsp.tv/play/pforum.php?mode=all&num=84288
関連スレッドです
スレのっとりになっちゃうんで 別スレッドを立ててみました



この記事に返信する


Y_repeat

リンク

2018/5/12(Sat) 14:58:25|NO.84327

質問①
今日か明日の指定時刻になったら 効果音を鳴らすTOOLを作成したんですけど
明日になった判定の仕方がわからなくて
明日を指定するといつまでたっても指定時刻になんないまんま 投稿しました
明日の特定の時刻になったらって どうやって判定するんですか?
TOOLはソースコードつきで配布を考えているので
再配布可のソースコードでお願いします

今、考えたら 「今日」ボタンを押した日にちの次の日になったら
効果音を鳴らしてみようかな。と思うんですけど
それなしのほうがいいちゃいいですね
TOOLを動かしたまんま スリープしたり
指定の時刻の時は スリープしてたりも 考えられます



Y_repeat

リンク

2018/5/12(Sat) 15:00:57|NO.84328

質問②
特定の日付まで何日か?を教えてくれるTOOLを書いたんですけど
日にちの理解が浅くて 今年か去年しか指定できませんでした
特定の年の特定の日にちまで何日か数えるという処理は
どうなるんでしょうか
TOOLはソースコードつきで配布を考えているので
再配布可のソースコードでお願いします



Y_repeat

リンク

2018/5/12(Sat) 15:04:37|NO.84329

質問③
日にちの操作がよくわかってなくて
指定の曜日の指定の時刻になったら 効果音を鳴らすTOOLを作成しようとして
結局あきらめたんですけど
指定の曜日の指定の時刻になったら 効果音を鳴らす処理ってどうやるんですか?
例えば今日を土曜日として金曜日は昨日なのか来週なのか
よくわかってなかったり
ここもボタンを押した日から後の曜日ってことにしたほうが楽かも
TOOLはソースコードつきで配布を考えているので
再配布可のソースコードでお願いします



Velgail

リンク

2018/5/12(Sat) 15:28:12|NO.84330

一般理解に基づく回答としてはこうかな。

1. 次の指定時刻になったら鳴る。なったあとに止める(ワンタイムアラーム型)
 つまり、デジタル時計の標準的なアラームで、なったらスイッチをオフにするような運用。今日か次の日かはどうでもよく、「指定時間になったら鳴る、止めたらオフにする」の実装をすれば良いタイプ
 また、質問内容通りのパターンであれば、アラームをセットした時点での翌日のデータも含めて保存する。2018/05/12にセットしたから、2018/05/13の指定時間に といった形で。

2. 特定の日にちまで何日かは愚直に数えれば良い。人がやるとおりに計算させれば良い。

3. 指定の曜日になったら鳴る。毎週鳴る(定期的アラーム型)
 アラームをオフにした時点で、次のアラームの時刻をセットするワンタイムアラーム型とも書ける。
 昨日か来週か? そんなことに意味がありましたか?

という感じの回答ですかね。ソースを起こすまでもない処理な気がするので書いてませんが。



Y_repeat

リンク

2018/5/12(Sat) 16:20:03|NO.84332

コメントありがとうござます→Velgailさん
前のスレッドのスクリプトが読めなくて
逆に流れだけ 提示してくれた のも良かったのかな?

自分、未だに他人のスクリプトがあんまり読めなくて
やっぱプログラミング向いてないのかな?と最近思います

>2018/05/12にセットしたから、2018/05/13の指定時間 といった形で。
次の日って何気に難しいんですよね
来年の指定の日にちまで何日か数えれたから
やって出来なくはないっちゃないですが

>3. 指定の曜日になったら鳴る。毎週鳴る(定期的アラーム型)
> アラームをオフにした時点で、次のアラームの時刻をセットするワンタイムアラーム型とも書ける。
> 昨日か来週か? そんなことに意味がありましたか?
そう言えば 今日/明日 は
指定時刻までの時間を表示してました
週 も残り何日か何時間か表示したいと思います
たぶんアレですね TOOLとして考えるのではなく
モジュールを書いて分割したほうがいいのかな?
ごっちゃになるので



あらや

リンク

2018/5/12(Sat) 17:27:30|NO.84333

前スレの私のソースに少々手を加えれば大体できます。
しかし、どうも常駐型のアプリっぽいのですがdishでのその方法はわかりません。


前ソースの考え方は

開始日時 △■■■■■○
計測日時 △■■■■■○■■■■■▽■■■■□

△=開始年の1月1日
○=開始年月日
▽=計測年の1月1日
□=計測年月日

開始年月日から計測年月日までの日数を数えるには
○から□までの日数がわかればいいのですから

△~○の日数(開始年月日がその年の何日目か)……①
△~▽の日数(だいたい365日、うるう年は366日)……②
▽~□の日数(計測年月日がその年の何日目か)……③

②+③-①を計算すれば
開始年月日から計測年月日までの日数になることがわかると思います。
この①②③はソースのコメントに書いた番号そのままです。
そしてこれが質問②の答えそのものです。



時間に関しても考え方は同じで

開始日時 △■■■■■○
計測日時 △■■■■■○■■■■■▽■■■■□

△=開始日の0時0分0秒
○=開始時刻
▽=計測日の0時0分0秒
□=計測時刻

△~○ 開始した時分秒は開始日0時0分0秒から何秒後なのか……④
△~▽ 計測日の0時0分0秒 は 開始日の0時0分0秒から何『秒』後なのか……⑤
▽~□ 計測した時分秒は計測日0時0分0秒から何秒後なのか……⑥

⑤+⑥―④を計算すれば
開始日時から計測日時までの秒数になります。

日数計算も秒数計算も基準になる箇所(図の△)を0として
開始日時は0からどれくらいなのか
計測日時は0からどれくらいなのか
という量を明確にして計測日時から開始日時を引くと
開始日時から計測日時までの量(日数や秒数)を導き出すという手法で算出しています。



質問①:
指定する時刻を H時 M分 S秒 とした場合

// アラームの時刻を秒に換算 AlarmTime = 3600*H + 60*M + S; // 現在の時刻を取得 NowHour = gettime(4); // 時 NowMinute = gettime(5); // 分 NowSecond = gettime(6); // 秒 // 現在の時刻を秒に換算 NowTime = 3600*NowHour + 60*NowMinute + NowSecond; // 秒数比較 if( AlarmTime < NowTime ) { // アラームの時刻をすぎている場合、明日の指定時刻までの秒数を算出 AlarmTime += 86400; AlarmTime -= NowTime; } else { // まだアラームの時刻になっていない場合、今日の指定時刻までの秒数を算出 AlarmTime -= NowTime; }
あとはループ待機で開始時刻から現在時刻までの経過秒数が
AlarmTimeと一致したら音を鳴らす、という感じです。



質問②:
これは前スレのソースをそのまま使えます。

以下前スレのソースから必要箇所の抜き出し

// 開始日時を記録 startyear = gettime(0); // 年 startmonth = gettime(1); // 月 startday = gettime(3); // 日 ;~省略~ // 計測日時を記録 checkyear = gettime(0); // 年 checkmonth = gettime(1); // 月 checkday = gettime(3); // 日 ;~省略~ // ②+③-① = 経過日数 passdays = SdayfToCdayf + checkyeardays - startyeardays;
gettimeで取得している年月日に具体的な数値を入れてみてください。
開始年月日から計測年月日までの日数がpassdaysに入ります。



質問③:
これは質問①とほとんど同じです。
指定する曜日をWeekDay、時刻を H時 M分 S秒 とした場合

// アラームの時刻を秒に換算 AlarmTime = 3600*H + 60*M + S; // 現在の曜日と時刻を取得 NowWDay = gettime(2); // 曜日 NowHour = gettime(4); // 時 NowMinute = gettime(5); // 分 NowSecond = gettime(6); // 秒 // 現在の時刻を秒に換算 NowTime = 3600*NowHour + 60*NowMinute + NowSecond; // 曜日の比較 if( NowWDay == WeekDay ) { // 指定した曜日と今日の曜日が一致している場合 // 秒数比較 if( AlarmTime < NowTime ) { // アラームの時刻をすぎている場合、来週の指定時刻までの秒数を算出 AlarmTime += 86400*7; AlarmTime -= NowTime; } else { // まだアラームの時刻になっていない場合、今日の指定時刻までの秒数を算出 AlarmTime -= NowTime; } } else:if( NowWDay < WeekDay ) { // 同じ週でまだ指定曜日になっていない場合 d = WeekDay - NowWDay; // 指定曜日までの日数 // 指定曜日・指定時刻までの秒数 AlarmTime += 86400*d; AlarmTime -= NowTime; } else { // 指定曜日を過ぎている場合 d = 6 - NowWDay + WeekDay; // 次週の指定曜日までの日数 // 指定曜日・指定時刻までの秒数 AlarmTime += 86400*d; AlarmTime -= NowTime; }
あとは質問①と同じくループ待機で開始時刻から現在時刻までの経過秒数が
AlarmTimeと一致したら音を鳴らし、次の週に向けてこれと同じ処理をして
またAlarmTimeを算出しループ待機する、音を鳴らしたらAlarmTimeを算出しループ待機する
の繰り返しです。


まあ、質問①と質問③は指定時刻までの秒数を数えるのではなく
常駐アプリならループ待機中にgettimeで曜日や時刻を取得して
指定時刻と一致したら音を鳴らすってだけでもいい気がしますが。



あらや

リンク

2018/5/12(Sat) 17:37:14|NO.84334

一部訂正

誤:
△~▽の日数(だいたい365日、うるう年は366日)……②

正:
△~▽の日数(開始年1月1日から計測年1月1日までの日数)……②

でした。
失礼しました。



Y_repeat

リンク

2018/5/13(Sun) 00:07:28|NO.84348

回答ありがとうございます→あらやさん

マイナーアップデートの
(新しいTOOL思いつかなくてw)
タイマーTOOL集として今年のコンテストに出品しようかなってとこです

>しかし、どうも常駐型のアプリっぽいのですがdishでのその方法はわかりません。
常駐型っていうか アプリ起動しっぱなしですね
常駐型にして音だけ鳴るのもいいかもしれませんね
作り方わかんないですけど→常駐アプリ

自分の場合、主にwinタブレットで使ってますので
dishじゃないから大丈夫そうです



Y_repeat

リンク

2018/5/14(Mon) 18:54:55|NO.84389

こんばんわ
とりあえず①だけ実装出来たとこです
最初にサンプルスクリプトありではなく
中途半端なTOOLスクリプトを修正するかんじなので
ちょっと大変だったり
試行錯誤しながらサンプル読んでると ただ読むより読めますな
まだ理解出来ていませんが

①は土曜日を特別扱いして分岐してやってます

③はそんなかんじで 7通り分岐でやろうかな。と

自分、目覚まし時計とか 鳴って起きたら タイマーのスイッチ切る派なので
鳴るのは一回だけ的な修正をかけてたら またサンプルスクリプトからそれてたり

明日は何日か?とか次のX曜日は何日か?とか
どっかにありそうなんですが。ないですか?



あらや

リンク

2018/5/14(Mon) 23:48:35|NO.84397

>明日は何日か?とか次のX曜日は何日か?とか
>どっかにありそうなんですが。ないですか?
○日後の日付の方はありそうで、実際プログラム自体はあるんですが
ソースはあまり無いみたいです。
あることはあるんですが、あまり詳しい説明も無かったです。

次のX曜日は何日かというのは、次のX曜日は何日後かを求めれば
上記と同じ○日後の日付を求める方法で可能ですね。
X曜日は何日後かというのはサンプルを探すまでもないです。

そんなわけでモジュール化してみました。

GetDate sy, sm, sd, ad, dy, dm, dd // sy年sm月sd日のad日後の日付をdy,dm,ddに返す
GetDayOfWeek(year, month, day) // 日付の曜日を取得
CountNextDOW(DayOfWeek) // DayOfWeek曜日は何日後かを返す

GetDayOfWeekやCountNextDOWで使う曜日は
gettimeと同じで、0が日曜~6が土曜です。

#module #deffunc _init dim monthdays, 13; // 各月の日数 monthdays = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; return; // うるう年の確認 戻り値が1ならうるう年 #defcfunc CheckLeap int year if( (((year\4) == 0) && ((year\100) != 0)) || ((year\400) == 0) ) { rc = 1; } else { rc = 0; } return rc; // 指定月日は指定年の1月1日から何日後かを返す #defcfunc CountYearDay int year, int month, int day _init; leap = CheckLeap(year); // うるう年の確認 rc = 0; repeat month - 1, 1 rc += monthdays(cnt); // 各月の日数を足していく if( cnt == 2 ) : rc += leap; // 2月はうるう年を考慮 loop rc += day - 1; return rc; // 西暦1年1月1日から指定年1月1日までのうるう年の回数を返す #defcfunc CountLeap int year return (year - 1)/4 - (year - 1)/100 + (year - 1)/400; // 指定した日付に指定日数を足した日付を返す #deffunc GetDate int syear, int smonth, int sday, int pdays, var dyear, var dmonth, var dday _init; days = CountYearDay(syear, smonth, sday); // syear年1月1日からsmonth月sday日までの日数 days += pdays; // 指定日数を足す if( days > 364 ) { // 1月1日からの日数が364日以上(12月31日以降)の場合、年が変わる y = days / 365; // 何年後なのか(暫定) passdays = y * 365; // syear年1月1日から y年後1月1日までの日数(概算) passdays += CountLeap(syear + y) - CountLeap(syear); // うるう年分を足して正確な日数を算出 if( passdays == days ) { // 一致する場合はちょうどy年後の1月1日 dyear = syear + y; dmonth = 1; dday = 1; return; } else:if( passdays > days ) { // 足りない場合はy-1年後 y--; // 日数計算し直し passdays = y * 365; passdays += CountLeap(syear + y) - CountLeap(syear); } d = days - passdays + 1; // y年後のd日目になる } else { y = 0; // 同年 d = days + 1; // 同年のd日目 } m = 0; leap = CheckLeap(syear + y); // うるう年の確認 repeat 12, 1 d -= monthdays(cnt); // 各月の日数を引いて何月かを確定する if( cnt == 2 ) : d -= leap; m = cnt; if( d < 1 ) { // 0以下になった月が求める月 d += monthdays(cnt); if( cnt == 2 ) : d += leap; break; } loop dyear = syear + y; dmonth = m; dday = d; return; // 指定した日付の曜日を返す 0が日曜、1が月曜...6が土曜 (ツェラーの公式に少し手を加えたもの) #defcfunc GetDayOfWeek int year, int month, int day p01 = year / 100; p02 = year \ 100; rc = day + (month + 1)*26/10 + p02 + p02/4 + p01/4 - p01*2 + 6; rc \= 7; return rc // 指定した曜日が何日後かを返す #defcfunc CountNextDOW int dow nowdow = gettime(2); // 今日の曜日 if( nowdow == dow ) { // 今日の曜日と指定した曜日が一致する場合は7日後を返す rc = 7; } else:if( nowdow < dow ) { // 同じ週でまだ指定曜日になっていない場合 rc = dow - nowdow; // 指定曜日までの日数 else { // 指定曜日を過ぎている場合 rc = 7 - nowdow + dow; // 次週の指定曜日までの日数 } return rc; #global // 日付+○日数後の年月日 year = 2018; // 年 month = 5; // 月 day = 15; // 日 GetDate year, month, day, 20, y, m, d; mes strf("%d年%02d月%02d日の20日後は、%d年%02d月%02d日です。", year, month, day, y, m, d ); // 指定した日付の曜日を取得 dow = GetDayOfWeek(year, month, day); if( dow == 0 ) { strdow = "日曜日"; } else:if( dow == 1 ) { strdow = "月曜日"; } else:if( dow == 2 ) { strdow = "火曜日"; } else:if( dow == 3 ) { strdow = "水曜日"; } else:if( dow == 4 ) { strdow = "木曜日"; } else:if( dow == 5 ) { strdow = "金曜日"; } else:if( dow == 6 ) { strdow = "土曜日"; } mes strf("\n%d年%02d月%02d日は、%sです。", year, month, day, strdow ); // 指定した曜日は何日後かを取得 mes "\n次の日曜日まであと"+CountNextDOW(5)+"日です。";



GENKI

リンク

2018/5/15(Tue) 00:26:00|NO.84398

> 質問②
> 明日は何日か?とか次のX曜日は何日か?とか

ユリウス日に換算すれば日数計算や曜日の問題は解決しそうですね。
ということで相互変換モジュールどうぞ。

修正ユリウス日換算モジュール
http://mclab.uunyan.com/dl/dl46.htm

ユリウス日については別途検索してみてください。もしくはどなたか概要説明お願いします。

ユリウス通日 - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5

グレゴリオ暦と修正ユリウス日
http://mclab.uunyan.com/lab/hspneta/neta010.htm



あらや

リンク

2018/5/15(Tue) 23:27:06|NO.84420

ああ、最後の行ミスしてました。

誤: mes "\n次の日曜日まであと"+CountNextDOW(5)+"日です。";
正: mes "\n次の日曜日まであと"+CountNextDOW(0)+"日です。";

最初に金曜で確認してたのを忘れて文字だけ日曜にして肝心の数値を変えてなかった。。。

ついでにGetDateの方にもミスがありました。

ほかにもいくつか……。


修正してもいいですが、GENKIさんのモジュールをお勧めします。



Y_repeat

リンク

2018/5/16(Wed) 17:43:35|NO.84424

>あらやさん。GENKIさん
返答ありがとうございます

時刻の処理はデバッグしずらくて大変ですよね

とりあえず
あらやさんのサンプルスクリプトの理解出来る範囲と
GENKIさんのモジュールを
組み合わせてやろうと思っています

やろうとすることをネットに書くとやらない。の法則があるので
コード書いてから コメントするというのを
やれてないですけどこころがけてます

終わったらあんまり書くこともなくなっちゃったりするんですが



Y_repeat

リンク

2018/5/20(Sun) 18:50:43|NO.84460

こんばんわ。説明ありがとうございました
③一応実装出来ました
よくわかんないエラーもちらほらw

自分、実装遅すぎますよね
今日やる気になって今日終わった的な

素早く適切にコーディング出来る
Velgail様。あらや様。GENKI様がうらやましいですね



あらや

リンク

2018/5/20(Sun) 19:58:39|NO.84462

実装おめでとうございます。

私事ではあるんですが、
ミスしたままのソースだけを残しておくのもなんか嫌だったので
修正して、多少機能追加したモジュールを乗せさせていただきます。

// 参考URL // http://ufcpp.net/study/algorithm/o_days.html // http://www5e.biglobe.ne.jp/~emm386/2016/zeller/jd01.html #module // うるう年の確認 戻り値が1ならうるう年 #defcfunc CheckLeap int year if( (((year\4) == 0) && ((year\100) != 0)) || ((year\400) == 0) ) { rc = 1; } else { rc = 0; } return rc; // 指定年1月1日から指定月日まで何日後かを返す #defcfunc CountYearDay int year, int month, int day y = year; m = month; if( m < 3 ) { // 1月、2月は前年の13月、14月と考える y--; m += 12; } cyd01 = (m * 979 - 1033) >> 5; // 月の日数の合計値 leap1 = CheckLeap(y); // うるう年の確認 rc = cyd01 + leap1 + day - 1; if( m > 12 ) { rc -= 365 + leap1; } return rc; // 西暦1年1月1日から指定年1月1日までのうるう年の回数を返す #defcfunc CountLeap int year cl01 = year / 100; return (year >> 2) - cl01 + (cl01 >> 2); ; ビット演算 (year - 1)/4 - (year - 1)/100 + (year - 1)/400; とほぼ同じ意味 // 西暦1年1月1日から指定年月日までの日数を返す #defcfunc CountDate int year, int month, int day y = year; m = month; if( m < 3 ) { // 1月、2月は前年の13月、14月と考える y--; m += 12; } cd01 = (y - 1) * 365; // 年数*365日 cd02 = CountLeap(y); // うるう年の回数 cd03 = (m * 979 - 1033) >> 5; // 月の日数の合計値 return (cd01 + cd02 + cd03 + day - 1); // 分子がマイナス値の場合を含む除算の商を返す #defcfunc Div int nume, int deno rc = nume / deno; if( (nume < 0) && ((nume\deno) != 0) ) { rc--; } return rc; // 分子がマイナス値の場合を含む除算の剰余を返す #defcfunc Mod int mnume, int mdeno modrc = mnume - Div( mnume, mdeno ) * mdeno; return modrc; // CountDaysのサブルーチン #defcfunc _Sub_CountDays int year, int month, int day sub_y = year: sub_m = month; if( sub_m < 3 ): sub_y--: sub_m +=12; // 1月と2月は前年の13月、14月として扱う days = (sub_y - 1) * 365; // 経過年数*365日 days += CountLeap(sub_y); // うるう年分を加算 days += (sub_m * 979 - 1033) >> 5; // 1月1日から month月1日までの日数を加算 days += day - 1; // day日を加算し1引く return days; // 指定した日付1から日付2までの日数を返す #defcfunc CountDays int year1, int month1, int day1, int year2, int month2, int day2 if( year1 > year2 ) { // 日付1の年の方が大きい場合逆転させる rflag = 1; y1 = year2: m1 = month2: d1 = day2; y2 = year1: m2 = month1: d2 = day1; } else { rflag = 0; y1 = year1: m1 = month1: d1 = day1; y2 = year2: m2 = month2: d2 = day2; } // うるう年の定義上、400年分の日数は固定なので一旦除外する y400d_1 = Div( y1, 400 ); // 日付1の年を400で割ったときの商 y400m_1 = Mod( y1, 400 ); // 日付1の年を400で割ったときの剰余 y400d_2 = Div( y2, 400 ); // 日付2の年を400で割ったときの商 y400m_2 = Mod( y2, 400 ); // 日付2の年を400で割ったときの剰余 // 剰余で出た年を基準として、西暦1年1月1日から日付1までの日数を計算 days1 = _Sub_CountDays(y400m_1, m1, d1); // 日付2の処理に関しても同様の計算を行なう days2 = _Sub_CountDays(y400m_2, m2, d2); // 合算処理、除外した400年分の日数を戻しつつ日数を算出する rc = (y400d_2 - y400d_1) * 146097 + days2 - days1; if( rflag ): rc = -rc; // 逆転していた場合はマイナスにする return rc; // 指定した日付に指定日数を足した日付を返す #deffunc GetDate int syear, int smonth, int sday, int pdays, var dyear, var dmonth, var dday y400d_s = Div( syear, 400 ); // 日付の年を400で割ったときの商(一旦除外) y400m_m = Mod( syear, 400 ); // 日付の年を400で割ったときの剰余 s_days = _Sub_CountDays(y400m_m, smonth, sday); // 指定した日付の日数を算出 // 加算する日数を加工 prc01_d = Div( pdays, 146097 ); // 400年分の日数で割った商(一旦除外) prc01_m = Mod( pdays, 146097 ); // 400年分の日数で割った剰余 y400d_s += prc01_d; // 年数(400年分)を加算 s_days += prc01_m; // 日数を加算 // 日数から日付を算出して、最後に一時除外した400年分の年数を加算する prc01_d = Div( s_days, 146097 ); // 400年分の日数で割った商 prc01_m = Mod( s_days, 146097 ); // 400年分の日数で割った剰余 prc02_d = Div( prc01_m, 36524 ); // 約100年分の日数で割った商 prc02_m = Mod( prc01_m, 36524 ); // 約100年分の日数で割った剰余 if( prc02_d == 4 ): prc02_d--: prc02_m == 36524; // 0 <= prc02_d < 4 の範囲に補正 prc03_d = Div( prc02_m, 1461 ); // 約4年分の日数で割った商 prc03_m = Mod( prc02_m, 1461 ); // 約4年分の日数で割った剰余 prc04_d = Div( prc03_m, 365 ); // 約1年分の日数で割った商 prc04_m = Mod( prc03_m, 365 ); // 約1年分の日数で割った剰余 if( prc04_d == 4 ): prc04_d--: prc04_m == 365; // 0 <= prc04_d < 4 の範囲に補正 dyear = (y400d_s + prc01_d)*400 + prc02_d*100 + prc03_d*4 + prc04_d + 1; // 年を算出 // 剰余の数値から月の算出 leap = 59 + CheckLeap(dyear); // 1月と2月を13月と14月として扱うため、うるう年を考慮した補正定数 if( (prc04_m-leap) < 0 ) { prc04_m += 306; // マイナス値(1月と2月)の場合は3月~12月の日数分加算 } else { prc04_m -= leap; // 補正(3月1日が0になる) } dmonth = (prc04_m * 5 + 2) / 153 + 3; // 月の算出(3月~14月) if( dmonth > 12 ): dmonth -= 12; // 月の補正(13月と14月を1月と2月にする) // 剰余の数値及び、算出した月の数値から日の算出 if( dmonth < 3 ) { // 1月と2月の処理 dday = prc04_m - ( (dmonth + 9) * 153 + 2 ) / 5 + 1; } else { // 3月以降の処理 dday = prc04_m - ( (dmonth - 3) * 153 + 2 ) / 5 + 1; } return; // 指定した日付の曜日を返す 0が日曜、1が月曜...6が土曜 (ツェラーの公式に少し手を加えたもの) #defcfunc GetDayOfWeek int year, int month, int day p01 = year / 100; p02 = year \ 100; rc = day + (month + 1)*26/10 + p02 + p02/4 + p01/4 - p01*2 + 6; rc \= 7; return rc // 指定した曜日が何日後かを返す #defcfunc CountNextDOW int dow nowdow = gettime(2); // 今日の曜日 rc = dow - nowdow; if( rc <= 0 ) { rc += 7; } return rc; #global // 日付+○日数後の年月日 year = 2018; // 年 month = 5; // 月 day = 20; // 日 GetDate year, month, day, 200, y, m, d; mes strf("%d年%02d月%02d日の200日後は、%d年%02d月%02d日です。", year, month, day, y, m, d ); mes " ↓逆も可"; GetDate year, month, day, -200, y, m, d; mes strf("%d年%02d月%02d日の200日前は、%d年%02d月%02d日です。", year, month, day, y, m, d ); // 指定した日付の曜日を取得 dow = GetDayOfWeek(year, month, day); if( dow == 0 ) { strdow = "日曜日"; } else:if( dow == 1 ) { strdow = "月曜日"; } else:if( dow == 2 ) { strdow = "火曜日"; } else:if( dow == 3 ) { strdow = "水曜日"; } else:if( dow == 4 ) { strdow = "木曜日"; } else:if( dow == 5 ) { strdow = "金曜日"; } else:if( dow == 6 ) { strdow = "土曜日"; } mes strf("\n%d年%02d月%02d日は、%sです。", year, month, day, strdow ); // 指定した曜日は何日後かを取得 mes "\n次の日曜日まであと"+CountNextDOW(0)+"日です。"; // 2つの日付間の日数を取得 year1 = 2018; // 年1 month1 = 5; // 月1 day1 = 20; // 日1 year2 = 2068; // 年2 month2 = 3; // 月2 day2 = 29; // 日2 d1 = CountDays(year1, month1, day1, year2, month2, day2); d2 = CountDays(year2, month2, day2, year1, month1, day1); mes strf("\n%d年%02d月%02d日は、%d年%02d月%02d日の%d日後です。", year2, month2, day2, year1, month1, day1, d1 ); mes " ↓逆も可"; mes strf("%d年%02d月%02d日は、%d年%02d月%02d日の%d日後です。", year1, month1, day1, year2, month2, day2, d2 );

○日後の日付取得や
2つの日付の日数を取得する関数では負数にも対応してみました。

○日後の日付取得はプラスは1万年後まで、マイナスは紀元前1万年まで確認したので
たぶんミスは無いと思います。

紀元前を西暦年月日にする意味は無かったような気もしましたが、
結果的に出来てしまっただけです。。。



a

リンク

2018/5/21(Mon) 19:38:39|NO.84465




Y_repeat

リンク

2018/5/22(Tue) 17:58:22|NO.84475

こんにちわ
②割と簡単に実装出来ました
あらやさんのモジュールを使いました
GENKIさんのは13kbもあって
そんなのを理解出来ないっすみたいな

モジュールのおかげです
ありがとうございました

>よくわかんないエラーもちらほらw
たぶん無限ループでinputに描画し続けるメインルーチンがあって
ボタンを押して割り込むのが悪いんだと思います

去年、TOOL集書いてた時も
その仕様で苦労しました



ソラ

リンク

2018/5/22(Tue) 21:22:03|NO.84476

インプットに対して期待通りのアウトプットがあればその過程を理解する必要はないのでは。



Y_repeat

リンク

2018/5/22(Tue) 23:10:20|NO.84479

>ソラさん
ですね。でもそれだと
コピペするだけになっちゃいますからね

ちなみに②は
NO.84462のモジュールを
半分くらいしか理解してないけど
利用させていただきました



ONION software Copyright 1997-2025(c) All rights reserved.