【AutoHotkey】任意の日時に直近の W 曜日の年月日を取得する。
先週の木曜日って何日だっけ?
というシーンありませんか?
先週から日付の計算処理をちょこちょこやっています。
それと同時に、ラジコのウェブサイトでラジオ放送を再生させる処理も行っています。
これをペンパイナップルアップルペンいたしますと、生活習慣の都合で聞き逃した番組をRadiko タイムフリーで おさらいできることになります。
Radiko タイムフリーは前日から一週間以内に放送した番組を聞くことができます。
深夜の番組を就寝前に聞くといったことが可能です。
今回はそれを目指して直近の W 曜日の年月日を取得する関数を作ってみたいと思います。
やりたいこと。
番組の放送局と日時さえわかれば、過去の番組の放送データのページを開いてもらうようにできます。
先週月曜日の夜9時半の番組を今日の20時30分から聴きたいとなった時に、今日から見て前回の月曜日が何日かを計算できなければなりません。
「今日から見て」遡った一週間といっても、 翌日になれば今日が違うので起点となる年月日は必要です。
人間がカレンダーを見れば簡単なんですけどね。
今日の日付から左を見て月曜日の日付を見るだけ。
ただし今日が日曜なら月曜日は右にあるので一段上の月曜日を見る。
つまり目的の曜日が今日の曜日よりも右にあるなら一段上の曜日を見ます。
それだけです。
実装。
希望の曜日になるまでループで1日ずつ減らしていけば簡単ですが、さすがにその使用はちょっと恥ずかしいので計算で出します。
前回年月日から曜日を求める確認できたので、起点となる年月日lastdateの曜日を見ます。
曜日は日曜日を1として数値で表されるんでしたね。
lastdate := basedate ;ベースとなる日付の曜日を取得。 FormatTime, wd, %lastdate%, WDay
myahk/testlastwday.ahk at master · yasushiito/myahk
Formattime コマンドで変数 wd に渡ってきた日付lastdateの曜日が入ります。
パラメーターlastwdayで目的の曜日が渡ってきています。
目的の曜日lastwdayとその曜日wdの差をとれば、 何日前かわかります。
例えば木曜日(5)から見て月曜日(2)の番組を聞きたいのなら、両者の差が3なので3日前となります。
;直近の曜日とは何日違うか調べる。
x := (lastwday - wd)
myahk/testlastwday.ahk at master · yasushiito/myahk
ただし調べたい曜日がカレンダーで見て右側にあるなら、一週間(一段上に) 戻ります。
この場合でも曜日の差はマイナスで現れるので、差を取る式に変わりはありません。
;調べたい曜日が後ろの時は先週の曜日となる。 If wd <= %lastwday% x -= 7
myahk/testlastwday.ahk at master · yasushiito/myahk
タイムフリーでは同日の放送を聞くことはできませんから、曜日が同じならまるっと一週間遡ることになるので、条件にはイコールを含めておきます。
計算した遡るべき日数xを起点となる年月日lastdateに反映させれば完了です。
;ベースとなる日付から遡る xは負の値が入っているので ADD でも遡る。 EnvAdd, lastdate,%x%,Days
myahk/testlastwday.ahk at master · yasushiito/myahk
この関数を 、一週間全ての曜日のパターンでテストします。
メッセージボックスが49回出ます。
Loop, 7 { Loop, 7 { ;内側のループを曜日としてベースとなる年月日から遡って日時を返してもらう。 d := getDateByLastwday(bd,A_Index) } ;日付を1日進める。 EnvAdd, bd, 1, Days }
myahk/testlastwday.ahk at master · yasushiito/myahk
実行結果はこんな感じです。
--------------------------- 日時から曜日を調べる --------------------------- 元になる年月日は 20191023090918:4 知りたい曜日は 1 遡る日数は -3 直近の年月日は 20191020090918 --------------------------- OK ---------------------------
コード全体はこんな感じです。
この記事に登場するAutohotkey スクリプトについて
この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら。