A documentação para este módulo pode ser criada na página Módulo:Datas/doc

local modulo = {}

function modulo.ISO_8601 (frame)
	local meses = {janeiro = 1, fevereiro = 2, ["março"] = 3, abril = 4, maio = 5, junho = 6, julho = 7, agosto = 8, setembro = 9, outubro = 10, novembro = 11, dezembro = 12}
	
	local function mes_em_numero (mes) -- função auxiliar que converte para minúscula antes de usar a tabela meses
		if mes == nil then
			return nil
		else
			mes = mw.ustring.lower (mes)
			return meses[mes]
		end
	end
	
	local dia, mes, ano, entrada
	
	entrada = frame.args[1]
	entrada = mw.text.trim (entrada) -- tira espaços do começo e do fim
	
	mes, ano = mw.ustring.match (entrada, "^(%a+) de (%d+)$") -- formato com mês e ano (primeiro pois é o mais comum)
	mes = mes_em_numero (mes)
	if mes ~= nil then
		return string.format ("%.4d-%.2d", ano, mes)
	else
		dia, mes, ano = mw.ustring.match (entrada, "^(%d%d?) de (%a+) de (%d+)$") -- formato com dia, mês e ano
		mes = mes_em_numero (mes)
		if dia ~= nil and mes ~= nil then
			return string.format ("%.4d-%.2d-%.2d", ano, mes, dia)
		else
			ano = mw.ustring.match (entrada, "^(%d+)$") -- formato com apenas ano
			if ano ~= nil then
				return string.format ("%.4d", ano)
			else
				error ("formato de data inesperado")
			end
		end		
	end		
end

return modulo