Module:YMD to ISO

local p = {}

local function month_number(month_name)
    local months_full = {january=1, february=2, march=3, april=4, may=5, june=6, july=7, august=8, september=9, october=10, november=11, december=12}
    local months_abbr = {jan=1, feb=2, mar=3, apr=4, may=5, jun=6, jul=7, aug=8, sep=9, sept=9, oct=10, nov=11, dec=12}
    local month_lc, _ = string.gsub(string.lower(month_name),'%.','',1)
    local month_num = months_full[month_lc] or months_abbr[month_lc] or 0
    return month_num
end

local function days_in_month(month_num,year)
    -- modified from code in Module:Citation/CS1/Date_validation
    local days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    local month_length
    if month_num == 2 then         -- February: 28 days, unless leap year
        month_length = 28
        if year <= 1582 then       -- Julian calendar before Oct 1582
            if (year%4) == 0 then
                month_length = 29  -- if leap year, then 29 days
            end
        else                       -- Gregorian calendar since Oct 1582
            if ( (year%4)==0 and ((year%100)~=0 or (year%400)==0) ) then  
                month_length = 29  -- if leap year, then 29 days   
            end
        end
    else                           -- not February, get number of days for month
        month_length = days[month_num]
    end
    return month_length
end

local function zero_pad(string)
    if string.len(string) == 1 then
        return '0' .. string
    else
        return string
    end
end

function p.main(frame)
    if frame.args[1] == nil then
        return ''     -- first argument is missing
    end
    local arg1, _ = string.gsub(mw.text.trim(frame.args[1]),'_',' ')
    return p._main(arg1)
end
function p._main(arg1)
    if arg1 == '' then
        return ''     -- first argument is empty
    end
    if not arg1:match('^%d%d%d%d %a%a%a%a?%.?%a?%a?%a?%a?%a?%a? *%d%d?$') then
        return arg1   -- invalid date pattern
    end
    local year, month_name, day = string.match(arg1, '^(%d%d%d%d) *(%a%a%a%a?%.?%a?%a?%a?%a?%a?%a?) *(%d%d?)$')
    if month_number(month_name) == 0 then
        return arg1   -- invalid month name or abbreviation
    end
    if tonumber(day) < 1 or tonumber(day) > days_in_month(month_number(month_name),tonumber(year)) then
        return arg1   -- invalid day number for given month
    end
    return year .. '-' .. zero_pad(tostring(month_number(month_name))) .. '-' .. zero_pad(day)
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.