モジュールの解説[作成]
require('strict')
local p = {}
--[[--
ツェラーの公式を利用して西暦4年3月1日以降の曜日を求める。返される曜日は、ISO 8601に沿う。すなわち:
|--|---|
|日| 7 |
|月| 1 |
|火| 2 |
|水| 3 |
|木| 4 |
|金| 5 |
|土| 6 |

という対応が成り立つ。
--]]--

function p.weekday(y, m, d)
    if m == 1 or m == 2 then
        return p.weekday(y - 1, m + 12, d)
    end
    local Y = y % 100 -- y == 2021 -> Y == 21
    local C = (y - Y) / 100 -- y == 2021 -> C == 20
    local ga = 0
    if 1582 <= y then
        ga = -2 * C + math.floor(C / 4.0)
    elseif 4 <= y then
        ga = -C + 5
    else
        error("未対応の年が入力されました")
    end
    local h = d + math.floor(26 * (m + 1) / 10.0) + Y + math.floor(Y / 4.0) + ga
    return (h % 7) + 1
end

return p