Jump to content

Module:Date period

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Chlod (talk | contribs) at 08:40, 20 February 2021 (No need for "present" handling anymore since we already deal with invalid values.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

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

local p = {}

function p.main(frame)
	return p._main(frame.args[1], frame.args[2], frame.args['no-year'])
end

function p._main(_dateA, _dateB, noYear)
	if _dateA == nil and _dateB == nil then
		error('Date A or B not provided.')
	elseif _dateA == nil then
		return Date(_dateA):text('%B %-d')
	elseif _dateB == nil then
		return Date(_dateB):text('%B %-d')
	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
	
	-- Handles nil dateA or dateB, but not nil both.
	local showYear = (dateA or dateB).year ~= (dateB or dateA).year and yesno(noYear) == false
	
	-- Handle cases where one of the dates is not a valid date.
	if dateA == nil and dateB ~= nil then
		return _dateA .. ' – ' .. dateB:text('%B %-d') .. (showYear and (', ' .. dateB.year) or '')
	elseif dateB == nil and dateA ~= nil then
		return dateA:text('%B %-d') .. (showYear 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('%B %-d')
		elseif dateA.month == dateB.month then
			return dateA:text('%B %-d') .. ' – ' .. dateB.day .. (showYear and (', ' .. dateA.year) or '')
		else
			return dateA:text('%B %-d') .. ' – ' .. dateB:text('%B %-d') .. (showYear and (', ' .. dateA.year) or '')
		end
	else
		return dateA:text('%B %-d, %-Y') .. ' – ' .. dateB:text('%B %-d, %-Y')
	end
	
end

return p