Módulo:Datas

From WikiBr
Jump to navigation Jump to search


Descrição

Este é um módulo para conversão de formatos de datas.

Uso

Função ISO_8601

Converte uma data escrita por extenso para o formato ISO 8601 (AAAA-MM-DD, reconhecível pela #time). Caso a data não esteja no formato esperado, devolve um erro (que pode ser capturado pela #iferror).

Exemplos

  • {{#invoke:datas|ISO_8601|5 de março de 2014}} → 2014-03-05
  • {{#invoke:datas|ISO_8601|Dezembro de 2000}} → 2000-12
  • {{#invoke:datas|ISO_8601|1980}} → 1980
  • {{#invoke:datas|ISO_8601|blá}} → {{#invoke:datas|ISO_8601|blá}} Erro Lua na linha34: formato de data inesperado.

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