模組:沙盒/Willy1018/ChineseCalendar
外观
local p = {}
-- 天干與地支
local gan = {'甲','乙','丙','丁','戊','己','庚','辛','壬','癸'}
local zhi = {'子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'}
-- 傳統月份名稱
local monthNames = {'正','二','三','四','五','六','七','八','九','十','冬','臘'}
-- 傳統日期名稱(1=初一, 2=初二, ..., 30=三十)
local dayNames = {
'初一','初二','初三','初四','初五','初六','初七','初八','初九','初十',
'十一','十二','十三','十四','十五','十六','十七','十八','十九','二十',
'廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十'
}
-- 儒略日轉改良儒略日
function p.jdToMjd(jd)
return jd - 2400000.5
end
-- 改良儒略日轉儒略日
function p.mjdToJd(mjd)
return mjd + 2400000.5
end
-- 公曆轉儒略日(JD)
function p.dateToJD(year, month, day)
if month == 1 or month == 2 then
year = year - 1
month = month + 12
end
local A, B
if (year < 1582) or (year == 1582 and month < 10) or (year == 1582 and month == 10 and day < 15) then
B = 0 -- 儒略曆
else
A = math.floor(year / 100)
B = 2 - A + math.floor(A / 4) -- 格里曆修正
end
local C = math.floor(365.25 * year)
local D = math.floor(30.6001 * (month + 1))
return B + C + D + day + 1720994.5
end
-- 儒略日轉公曆
function p.jdToDate(jd)
jd = jd + 0.5
local Z = math.floor(jd)
local F = jd - Z
local A
if Z < 2299161 then
A = Z
else
local alpha = math.floor((Z - 1867216.25) / 36524.25)
A = Z + 1 + alpha - math.floor(alpha / 4)
end
local B = A + 1524
local C = math.floor((B - 122.1) / 365.25)
local D = math.floor(365.25 * C)
local E = math.floor((B - D) / 30.6001)
local day = B - D - math.floor(30.6001 * E) + F
local month, year
if E < 14 then
month = E - 1
else
month = E - 13
end
if month > 2 then
year = C - 4716
else
year = C - 4715
end
return year, month, day
end
-- 農曆計算邏輯(根據儒略日)
function p.getLunarDate(jd)
-- 此處應基於專業農曆演算法模組更新
local lunarYear = 2025 -- 假設年份
local lunarMonth = 4 -- 假設月份
local lunarDay = math.floor(jd % 30) + 1
local isLeapMonth = false
return {
year = lunarYear,
month = lunarMonth,
day = lunarDay,
isLeap = isLeapMonth
}
end
-- 干支計算邏輯
function p.getGanZhiYear(year)
local offset = (year - 1984) % 60
return gan[(offset % 10) + 1] .. zhi[(offset % 12) + 1]
end
-- 主函數:輸入年月日,返回農曆字符串
function p.getLunarString(frame)
local year = tonumber(frame.args.year)
local month = tonumber(frame.args.month)
local day = tonumber(frame.args.day)
if not (year and month and day) then
return "錯誤:請提供 year、month、day"
end
local jd = p.dateToJD(year, month, day)
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