Module:Date period

local Date = require('Module:Date')._Date local yesno = require('Module:Yesno')

local p = {}

local dateFormats = { ["mdy"] = "%B %-d", ["md"] = "%B %-d", ["month"] = "%B %-d", ["dmy"] = "%-d %B", ["dm"] = "%-d %B", ["day"] = "%-d %B" }

function p.main(frame) return p._main(		frame.args[1],		frame.args[2],		frame.args['force-year'],		frame.args['format'] or "mdy"	) end

function p._main(_dateA, _dateB, _forceYear, _format) -- mdy by default local dateFormat = dateFormats[_format] or "%B %-d" if _dateA == nil and _dateB == nil then error('Date A or B not provided.') elseif _dateA == nil then return Date(_dateA):text(dateFormat) elseif _dateB == nil then return Date(_dateB):text(dateFormat) end local dateA = Date(_dateA) local dateB = Date(_dateB) if dateA == nil and dateB == nil then error("Either date A, date B, or both dates must be valid.") end local forceYear = yesno(_forceYear) -- Handle cases where one of the dates is not a valid date. if dateA == nil and dateB ~= nil then return _dateA .. ' – ' .. dateB:text(dateFormat) .. (forceYear and (', ' .. dateB.year) or '') elseif dateB == nil and dateA ~= nil then return dateA:text(dateFormat) .. (forceYear and (', ' .. dateA.year) or '') .. ' – ' .. _dateB end if dateA.year == dateB.year then if dateA.month == dateB.month and dateA.day == dateB.day then return dateA:text(dateFormat) elseif dateA.month == dateB.month then return dateA:text(dateFormat) .. ' – ' .. dateB.day .. (forceYear and (', ' .. dateA.year) or '') else return dateA:text(dateFormat) .. ' – ' .. dateB:text(dateFormat) .. (forceYear and (', ' .. dateA.year) or '') end else -- Hide year if forced if forceYear == false then return dateA:text(dateFormat) .. ' – ' .. dateB:text(dateFormat) else return dateA:text(dateFormat .. ', %-Y') .. ' – ' .. dateB:text(dateFormat .. ', %-Y') end end end

return p