Skip to content

Instantly share code, notes, and snippets.

@agaelebe
Created March 8, 2009 20:12
Show Gist options
  • Save agaelebe/75886 to your computer and use it in GitHub Desktop.
Save agaelebe/75886 to your computer and use it in GitHub Desktop.
Calcula data do horario de verao brasileiro (incio e termino) dado o ano
# Horario de Verao Brasileiro em Ruby
#
# Dado um ano retorna o dia de inicio e termino do horario de verao brasileiro
# seguindo o decreto Nº 6.558, de 8 de setembro de 2008
# disponivel em: http://www.planalto.gov.br/ccivil_03/_ato2007-2010/2008/decreto/d6558.htm
# Valido a partir do ano de 2009
#
# Baseado no seguinte codigo em C#:
# http://blog.inspira.com.br/2009/03/algoritmo-para-inicio-e-fim-do-horario.html
# ou http://gist.github.com/75851
class DataHorarioVerao
def initialize(ano)
@ano = ano
@mes_inicio = 10 #outubro
@mes_fim = 2 #fevereiro
@ano_fim = ano + 1
end
# retorna a data de inicio do horario de verão
def data_inicio
Date.new(@ano, @mes_inicio, dia_inicio)
end
# retorna a data de termino do horario de verão
def data_fim
Date.new(@ano_fim, @mes_fim, dia_fim)
end
# retorna o dia do mês em que cai o terceiro domingo de outubro
# este dia representa o inicio do horário de verao
def dia_inicio
22 - Date.new(@ano, 10, 1).wday
end
# retorna o dia do mês do ano seguinte ao dado em que termina o horário de verão
def dia_fim
terceiro_domingo_de_fevereiro = 22 - Date.new(@ano_fim, 2, 1).wday
if terceiro_domingo_de_fevereiro == data_carnaval
return terceiro_domingo_de_fevereiro + 7
else
return terceiro_domingo_de_fevereiro
end
end
# retorna a data do domingo de carnaval,
# ou seja, 7 semanas antes da pascoa
def data_carnaval
data_pascoa - 49
end
# retorna a data do domingo de Pascoa segundo o calendario gregoriano
# aqui usa-se o algoritmo de Meeus Julian
# descrito em http://en.wikipedia.org/wiki/Easter_date#Meeus_Julian_algorithm
def data_pascoa
ano = @ano
a = ano % 4
b = ano % 7
c = ano % 19
d = (19*c + 15) % 30
e = (2*a + 4*b - d + 34) % 7
mes = ((d + e + 114)/31).floor
dia = ((d+ e + 114) % 31) + 1
data_pascoa_justiniano = Date.new(ano, mes, dia)
#adiciona 13 dias entre 1900 e 2099 para converter para o calendario gregoriano
if (1900..2099).include?(ano)
return data_pascoa_justiniano + 13
else
return data_pascoa_justiniano
end
end
end
#Exemplo de uso
data = DataHorarioVerao.new(2009)
puts "Em 2009 o horario de verao começa as zero hora do dia #{data.dia_inicio} de outubro \n e termina as zero hora do dia #{data.dia_fim} de Feveiro 2010."
puts "\nData do domingo de inicio: #{data.data_inicio};"
puts "Data do domingo de termino: #{data.data_fim};"
puts "Data do domingo de pascoa: #{data.data_pascoa};"
puts "Data do domingo de carnaval: #{data.data_carnaval}."
@thecharles
Copy link

Obrigado amigo!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment