Modul:Start date and age: Perbedaan antara revisi
Tampilan
Wikisporta (bicara | kontrib) k Melindungi "Modul:Start date and age" ([Sunting=Hanya untuk pengurus] (selamanya) [Pindahkan=Hanya untuk pengurus] (selamanya)) Tanda: Suntingan perangkat seluler Suntingan peramban seluler |
Wikisporta (bicara | kontrib) 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 | 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 | -- Fungsi untuk menghitung selisih tahun dan bulan secara presisi | ||
local function | local function calculateDuration(bYear, bMonth, bDay) | ||
local today = os.date("*t") | local today = os.date("*t") | ||
local | local y1, m1, d1 = bYear, bMonth, bDay | ||
local y2, m2, d2 = today.year, today.month, today.day | |||
if | |||
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 | return years, months | ||
end | end | ||
| Baris 31: | Baris 49: | ||
day = tonumber(day) | day = tonumber(day) | ||
else | else | ||
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 | local years, months = calculateDuration(year, month, day) | ||
local monthName = | 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 ( | -- Format Output: "20 Mei 2010 (16 tahun, 5 bulan yang lalu)" | ||
return string.format('%d %s %d <span class="force-break">( | return string.format('%d %s %d <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 <span class="force-break">(%s)</span>', day, monthName, year, durationStr)
end
return p