Module:Birthday

来自NeuroWiki
跳转到导航 跳转到搜索

此模块的文档可以在Module:Birthday/doc创建

local p = {}

-- 中文数字转换为阿拉伯数字
local function chineseToNumber(chinese)
    local numbers = {
        ["零"] = 0, ["一"] = 1, ["二"] = 2, ["三"] = 3,
        ["四"] = 4, ["五"] = 5, ["六"] = 6, ["七"] = 7,
        ["八"] = 8, ["九"] = 9, ["十"] = 10, ["十一"] = 11,
        ["十二"] = 12
    }
    return numbers[chinese] or nil
end

-- 英文月份转换为阿拉伯数字
local function englishToNumber(month)
    local months = {
        January = 1, February = 2, March = 3,
        April = 4, May = 5, June = 6,
        July = 7, August = 8, September = 9,
        October = 10, November = 11, December = 12,
        Jan = 1, Feb = 2, Mar = 3, Apr = 4,
        Jun = 6, Jul = 7, Aug = 8, Sep = 9,
        Oct = 10, Nov = 11, Dec = 12
    }
    return months[month] or nil
end

function p.calculateAge(frame)
    local birthYear = tonumber(frame.args[1])
    local birthMonthInput = frame.args[2]
    local birthDay = tonumber(frame.args[3])

    -- 检查缺失的输入
    if not birthYear and not birthMonthInput and not birthDay then
        return "错误:输入的年份、月份和日期都是空的。"
    end

    -- 转换月份
    local birthMonth
    if tonumber(birthMonthInput) then
        birthMonth = tonumber(birthMonthInput)  -- 如果是阿拉伯数字
    else
        birthMonth = chineseToNumber(birthMonthInput) or englishToNumber(birthMonthInput)
    end

    -- 生成日期字符串
    local dateString = ""

    if birthYear and birthMonth and birthDay then
        if type(birthMonthInput) == "string" and (birthMonthInput:match("^[A-Za-z]+$")) then
            -- 英文月份格式
            dateString = string.format("%s %d, %d", birthMonthInput, birthDay, birthYear)
        else
            -- 中文或阿拉伯数字格式
            dateString = string.format("%d年%d月%d日", birthYear, birthMonth, birthDay)
        end

        -- 计算年龄
        local currentYear = tonumber(os.date("%Y"))
        local currentMonth = tonumber(os.date("%m"))
        local currentDay = tonumber(os.date("%d"))

        local age = currentYear - birthYear

        if currentMonth < birthMonth or (currentMonth == birthMonth and currentDay < birthDay) then
            age = age - 1
        end

        return string.format("%s (%d岁)", dateString, age)
    else
        -- 如果月份是英文,且缺失年份或日期
        if type(birthMonthInput) == "string" and (birthMonthInput:match("^[A-Za-z]+$")) then
            if birthYear and not birthDay then
                return string.format("%s, %d", birthMonthInput, birthYear)  -- 仅年份
            elseif birthDay then
                return string.format("%s %d", birthMonthInput, birthDay)  -- 仅日期
            else
                return string.format("%s", birthMonthInput)  -- 仅月份
            end
        end
        
        -- 如果缺少年份、月份或日期中的任意一个,则只输出日期
        if birthYear and birthMonth then
            return string.format("%d年%d月", birthYear, birthMonth)  -- 年月
        elseif birthYear and birthDay then
            return string.format("%d年%d日", birthYear, birthDay)  -- 年日
        elseif birthMonth and birthDay then
            return string.format("%d月%d日", birthMonth, birthDay)  -- 月日
        elseif birthYear then
            return string.format("%d年", birthYear)  -- 仅年份
        elseif birthMonth then
            return string.format("%d月", birthMonth)  -- 仅月份
        elseif birthDay then
            return string.format("%d日", birthDay)  -- 仅日期
        else
            return "错误:输入的年份、月份和日期都是空的。"
        end
    end
end

return p