Module:Date: Difference between revisions

    (fix bug that can occur in {{age}} if attempt to make an invalid yyyy-02-29 date if need to fill month/day from other date)
    (update from sandbox: implement show=M (minutes) and show=s (seconds); better method to fill a partial date)
    Line 907: Line 907:
    -- Return filled date1, date2 (two full dates).
    -- Return filled date1, date2 (two full dates).
    local function filled(a, b)
    local function filled(a, b)
    -- Return date a filled, if necessary, with month and/or day from date b.
    -- The filled day is truncated to fit the number of days in the month.
    local fillmonth, fillday
    local fillmonth, fillday
    if not a.month then
    if not a.month then
    Line 915: Line 917:
    end
    end
    if fillmonth or fillday then  -- need to create a new date
    if fillmonth or fillday then  -- need to create a new date
    if (fillmonth or a.month) == 2 and (fillday or a.day) == 29 then
    a = Date(a, {
    -- Avoid invalid date, for example with {{age|2013|29 Feb 2016}} or {{age|Feb 2013|29 Jan 2015}}.
    month = fillmonth,
    if not is_leap_year(a.year, a.calendar) then
    day = math.min(fillday or a.day, days_in_month(a.year, fillmonth or a.month, a.calendar))
    fillday = 28
    })
    end
    end
    a = Date(a, { month = fillmonth, day = fillday })
    end
    end
    return a
    return a
    Line 1,402: Line 1,401:
    end
    end
    local H, M, S = diff.hours, diff.minutes, diff.seconds
    local H, M, S = diff.hours, diff.minutes, diff.seconds
    if code == 'dh' or code == 'dhm' or code == 'dhms' or code == 'h' or code == 'hm' or code == 'hms' then
    if code == 'dh' or code == 'dhm' or code == 'dhms' or code == 'h' or code == 'hm' or code == 'hms' or code == 'M' or code == 's' then
    local days = floor(diff.age_days + extra_days)
    local days = floor(diff.age_days + extra_days)
    local inc_hour
    local inc_hour
    Line 1,417: Line 1,416:
    inc_hour = true
    inc_hour = true
    end
    end
    end
    elseif code == 'M' then
    if S >= 30 then
    M = M + 1
    end
    end
    else
    else
    Line 1,443: Line 1,446:
    elseif code == 'hm' then
    elseif code == 'hm' then
    return hours, M
    return hours, M
    elseif code == 'M' or code == 's' then
    M = hours * 60 + M
    if code == 'M' then
    return M
    end
    return M * 60 + S
    end
    end
    return hours, M, S
    return hours, M, S