Документация
local p = {}

function parseISO8601Date(str)
	local pattern = "(%-?%d+)%-?(%d*)%-?(%d*)"
	local Y, M, D = mw.ustring.match( str, pattern )
	return tonumber(Y), tonumber(M), tonumber(D)
end

function p.parseISO8601(str)
	local ru = mw.getLanguage('ru');
	if 'table'==type(str) then
		if str.args and str.args[1] then
			str = '' .. str.args[1]
		else
			return 'unknown argument type: ' .. type( str ) .. ': ' .. table.tostring( str )
		end
	end
	local Y,M,D = parseISO8601Date(str)
	if Y ~= nil and M ~= nil and D ~= nil then
		return ru:formatDate('d xg Y', str)
	elseif Y ~= nil and M == nil and D == nil then
		return ru:formatDate('Y', str)
	elseif Y ~= nil and M ~= nil and D == nil then
		return ru:formatDate('F Y', str)
	else
		return "Wrong date format"
	end
end

return p