lua ( solar2D ) で色々作成していく。
solar2Dとかlua言語の説明はしないです。それぞれ検索をお願いします。
lua でカレンダー
luaでカレンダーを生成する必要があったが、どうやらザクっと検索する限りネット上ではデータとして生成してくれるものがないようです。
カレンダーの見た目とかいらないから、データ部分だけ欲しいですよね。
こういう小さくて実用的なプログラムって、案外見つからないものなんです。
だいたネットで配布されているレベルのものは「作りすぎ」で、全部入りなんですが、そこまでいらない、ということです。
ということで作成しました。
ソースコード
モジュールとして作成してあります。
calendar.lua として保存します。
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 |
local M = {} SECADAY = 60*60*24 function M:makeThisMonth() local todaytime = os.date("*t") return M:make(todaytime.year, todaytime.month) end function M:make(year, month) local ret = {} if year and month then local time_first_day = os.time{year=year, month=month, day=1} local ftime_first_day = os.date("*t",time_first_day) time_calendar = time_first_day-((ftime_first_day.wday-1)*SECADAY) while true do local t = os.date("*t",time_calendar) if t.wday == 1 and t.month > ftime_first_day.month then break end table.insert( ret, { year=t.year, month=t.month, day=t.day, wday=t.wday, wJ=M:wday2Jan(t.wday), tag= t.year.."-"..t.month.."-"..t.day, } ) time_calendar = time_calendar + SECADAY end end return ret end function M:wday2Jan(n) local w_list = {"日","月","火","水","木","金","土"} return w_list[n] end function M:dump(data) local val = "" for i,v in ipairs(data) do val = val .. (v.month .. "/" .. v.day .. "(".. v.wJ ..")") if v.wday < 7 then val = val .. " " else val = val .. "\n" end end print(val) end return M |
使い方
1 2 3 4 |
local calendar = require("calendar") thisMonth = calendar:makeThisMonth() calMonth = calendar:make(2021,9) calendar:dump(calMonth) |
make、もしくはmakeThisMonth(今月のカレンダーを生成)した時点で、日曜日を一番端にした状態で前後の月も含めて、カレンダーになるように出力しています。
もし中途半端な曜日で始まっていたり終わっていた場合、そのままではカレンダーになりませんね。
ですので、前後も含めて出力し、カレンダーの日付になります。
wday (weekday)という値が7の時(土曜日)改行すれば、そのままですぐにカレンダーが作成できます。
dumpはこの並びをコンソールで確認するために書き出します。
1 2 3 4 5 |
8/29(日) 8/30(月) 8/31(火) 9/1(水) 9/2(木) 9/3(金) 9/4(土) 9/5(日) 9/6(月) 9/7(火) 9/8(水) 9/9(木) 9/10(金) 9/11(土) 9/12(日) 9/13(月) 9/14(火) 9/15(水) 9/16(木) 9/17(金) 9/18(土) 9/19(日) 9/20(月) 9/21(火) 9/22(水) 9/23(木) 9/24(金) 9/25(土) 9/26(日) 9/27(月) 9/28(火) 9/29(水) 9/30(木) 10/1(金) 10/2(土) |
といった形に書き出されます。
ここまで純粋にデータの形になっていれば、あとはいくらでもカレンダーを出力できますね!