Lompat ke isi

Modul:Start date and age: Perbedaan antara revisi

Dari Wikisporta, ensiklopedia olahraga
k Melindungi "Modul:Start date and age" ([Sunting=Hanya untuk pengurus] (selamanya) [Pindahkan=Hanya untuk pengurus] (selamanya))
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Baris 2: Baris 2:


-- Nama bulan dalam bahasa Indonesia
-- Nama bulan dalam bahasa Indonesia
local months = {
local monthsName = {
     "Januari", "Februari", "Maret", "April", "Mei", "Juni",
     "Januari", "Februari", "Maret", "April", "Mei", "Juni",
     "Juli", "Agustus", "September", "Oktober", "November", "Desember"
     "Juli", "Agustus", "September", "Oktober", "November", "Desember"
}
}


-- Fungsi untuk menghitung umur / durasi berjalan
-- Fungsi untuk menghitung selisih tahun dan bulan secara presisi
local function calculateAge(bYear, bMonth, bDay)
local function calculateDuration(bYear, bMonth, bDay)
     local today = os.date("*t")
     local today = os.date("*t")
     local age = today.year - bYear
     local y1, m1, d1 = bYear, bMonth, bDay
      
    local y2, m2, d2 = today.year, today.month, today.day
     if today.month < bMonth or (today.month == bMonth and today.day < bDay) then
 
         age = age - 1
    local years = y2 - y1
    local months = m2 - m1
     local days = d2 - d1
 
     if days < 0 then
        months = months - 1
        local prevMonth = m2 - 1
        local prevYear = y2
        if prevMonth < 1 then
            prevMonth = 12
            prevYear = prevYear - 1
        end
        local daysInPrevMonth = (os.date("*t", os.time{year=prevYear, month=prevMonth+1, day=0})).day
        days = days + daysInPrevMonth
    end
 
    if months < 0 then
         years = years - 1
        months = months + 12
     end
     end
   
 
     return age
     return years, months
end
end


Baris 31: Baris 49:
         day = tonumber(day)
         day = tonumber(day)
     else
     else
        -- Jika menggunakan parameter terpisah: {{Start date and age|2010|5|20}} atau {{Start date and age|year=2010|month=5|day=20}}
         year = tonumber(args[1] or args.year)
         year = tonumber(args[1] or args.year)
         month = tonumber(args[2] or args.month)
         month = tonumber(args[2] or args.month)
Baris 42: Baris 59:
     end
     end


     local age = calculateAge(year, month, day)
     local years, months = calculateDuration(year, month, day)
     local monthName = months[month] or ""
     local monthName = monthsName[month] or ""
 
    -- Menyusun teks durasi secara dinamis (Tahun & Bulan)
    local durationStr = ""
    if years > 0 and months > 0 then
        durationStr = string.format('%d tahun, %d bulan yang lalu', years, months)
    elseif years > 0 then
        durationStr = string.format('%d tahun yang lalu', years)
    elseif months > 0 then
        durationStr = string.format('%d bulan yang lalu', months)
    else
        durationStr = 'baru saja'
    end


     -- Format Output: "20 Mei 2010 (umur 16 tahun)"
     -- Format Output: "20 Mei 2010 (16 tahun, 5 bulan yang lalu)"
     return string.format('%d %s %d&#160;<span class="force-break">(umur&#160;%d&#160;tahun)</span>', day, monthName, year, age)
     return string.format('%d %s %d&#160;<span class="force-break">(%s)</span>', day, monthName, year, durationStr)
end
end


return p
return p

Revisi per 17 Oktober 2026 20.35

Dokumentasi untuk modul ini dapat dibuat di Modul:Start date and age/doc

local p = {}

-- Nama bulan dalam bahasa Indonesia
local monthsName = {
    "Januari", "Februari", "Maret", "April", "Mei", "Juni",
    "Juli", "Agustus", "September", "Oktober", "November", "Desember"
}

-- Fungsi untuk menghitung selisih tahun dan bulan secara presisi
local function calculateDuration(bYear, bMonth, bDay)
    local today = os.date("*t")
    local y1, m1, d1 = bYear, bMonth, bDay
    local y2, m2, d2 = today.year, today.month, today.day

    local years = y2 - y1
    local months = m2 - m1
    local days = d2 - d1

    if days < 0 then
        months = months - 1
        local prevMonth = m2 - 1
        local prevYear = y2
        if prevMonth < 1 then
            prevMonth = 12
            prevYear = prevYear - 1
        end
        local daysInPrevMonth = (os.date("*t", os.time{year=prevYear, month=prevMonth+1, day=0})).day
        days = days + daysInPrevMonth
    end

    if months < 0 then
        years = years - 1
        months = months + 12
    end

    return years, months
end

function p.main(frame)
    local args = frame:getParent().args
    local year, month, day

    -- Cek jika input menggunakan format YYYY-MM-DD atau YYYY/MM/DD
    local inputStr = args[1] or ""
    if inputStr:find("^%d%d%d%d%-%d%d%-%d%d$") or inputStr:find("^%d%d%d%d/%d%d/%d%d$") then
        year, month, day = inputStr:match("(%d%d%d%d)[%-/](%d%d)[%-/](%d%d)")
        year = tonumber(year)
        month = tonumber(month)
        day = tonumber(day)
    else
        year = tonumber(args[1] or args.year)
        month = tonumber(args[2] or args.month)
        day = tonumber(args[3] or args.day)
    end

    -- Validasi Tanggal
    if not year or not month or not day or month < 1 or month > 12 or day < 1 or day > 31 then
        return '<span style="color:red; font-weight:bold;">[Format Tanggal Mulai Salah]</span>'
    end

    local years, months = calculateDuration(year, month, day)
    local monthName = monthsName[month] or ""

    -- Menyusun teks durasi secara dinamis (Tahun & Bulan)
    local durationStr = ""
    if years > 0 and months > 0 then
        durationStr = string.format('%d tahun, %d bulan yang lalu', years, months)
    elseif years > 0 then
        durationStr = string.format('%d tahun yang lalu', years)
    elseif months > 0 then
        durationStr = string.format('%d bulan yang lalu', months)
    else
        durationStr = 'baru saja'
    end

    -- Format Output: "20 Mei 2010 (16 tahun, 5 bulan yang lalu)"
    return string.format('%d %s %d&#160;<span class="force-break">(%s)</span>', day, monthName, year, durationStr)
end

return p