跳转到内容

模組:沙盒/Willy1018/ChineseCalendar

维基百科,自由的百科全书

这是本页的一个历史版本,由Willy1018留言 | 贡献2025年4月30日 (三) 19:50编辑。这可能和当前版本存在着巨大的差异。

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