模組:沙盒/Willy1018/ChineseCalendar
外观
local p = {}
-- 天干與地支
local gan = {'甲','乙','丙','丁','戊','己','庚','辛','壬','癸'}
local zhi = {'子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'}
-- 傳統月份名稱
local monthNames = {'正','二','三','四','五','六','七','八','九','十','冬','臘'}
-- 傳統日期名稱(1=初一, 2=初二, ..., 30=三十)
local dayNames = {
'初一','初二','初三','初四','初五','初六','初七','初八','初九','初十',
'十一','十二','十三','十四','十五','十六','十七','十八','十九','二十',
'廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十'
}
-- 公曆轉儒略日(JD)
function p.gregorianToJD(year, month, day)
if month <= 2 then
year = year - 1
month = month + 12
end
local A = math.floor(year / 100)
local B
if year > 1582 or (year == 1582 and (month > 10 or (month == 10 and day >= 15))) then
B = 2 - A + math.floor(A / 4)
elseif year == 1582 and month == 10 and day >= 5 and day <= 14 then
return nil, "錯誤:1582年10月5日至14日不存在(曆法改革)"
else
B = 0
end
local C = math.floor(365.25 * year)
local D = math.floor(30.6001 * (month + 1))
local jd = B + C + D + day + 1720994.5
return jd
end
-- 儒略日轉農曆日期(假設性邏輯)
function p.getLunarDate(jd)
-- 假設儒略日計算結果:替換為精確農曆演算法模組
local lunarYear = 2025 -- 這裡的年份作為模擬
local lunarMonth = 4 -- 這裡的月份作為模擬
local isLeapMonth = false -- 假設不是閏月
local lunarDay = math.floor((jd - 2459771.5) % 30) + 1 -- 使用儒略日模擬計算日期
return {
year = lunarYear,
month = lunarMonth,
isLeap = isLeapMonth,
day = lunarDay
}
end
-- 計算干支紀年(1984為甲子年)
function p.getGanZhiYear(year)
local offset = (year - 1984) % 60
return gan[(offset % 10) + 1] .. zhi[(offset % 12) + 1]
end
-- 主函數:輸入年月日 → 回傳農曆日期的字符串
function p.getLunarString(frame)
local y = tonumber(frame.args.year)
local m = tonumber(frame.args.month)
local d = tonumber(frame.args.day)
if not (y and m and d) then
return "錯誤:請提供 year、month、day"
end
local jd, err = p.gregorianToJD(y, m, d)
if not jd then
return err
end
local lunar = p.getLunarDate(jd) -- 使用改進的農曆函數
local gz = p.getGanZhiYear(lunar.year) -- 計算干支紀年
local monthStr = (lunar.isLeap and '閏' or '') .. monthNames[lunar.month] .. '月'
local dayStr = dayNames[lunar.day]
return '今日是' .. gz .. '年' .. monthStr .. dayStr
end
-- 必須返回表
return p