quarta-feira, 5 de março de 2014

Horário de Verão - ACBR

1:  /*A unit é pcnAuxiliar*/  
2:    
3:  function GetUTC(UF: string; const dataHora: TDateTime): string;  
4:  const  
5:   UTC4 = '.AC.AM.RR.RO.MT.MS.';  
6:   UTC3 = '.AP.PA.MA.PI.TO.GO.CE.RN.PB.PE.AL.SE.BA.MG.ES.RJ.SP.PR.SC.RS.DF.';  
7:  var  
8:   HorarioDeVerao: Boolean;  
9:  begin  
10:   if (UF = '90') or (UF = '91') or (UF = '') then  
11:     UF := 'DF';   
12:    
13:   HorarioDeVerao := IsHorarioDeVerao(UF, dataHora);  
14:    
15:   if AnsiPos('.' + UF + '.', UTC4) > 0 then  
16:   begin  
17:    Result := '-04:00';  
18:    if HorarioDeVerao then  
19:     Result := '-03:00';  
20:   end  
21:   else  
22:   if AnsiPos('.' + UF + '.', UTC3) > 0 then  
23:   begin  
24:    Result := '-03:00';  
25:    if IsHorarioDeVerao(UF, dataHora) then  
26:     Result := '-02:00';  
27:   end;  
28:  end;  
29:    
30:  function IsHorarioDeVerao(const UF: string; const dataHora: TDateTime): Boolean;  
31:  const  
32:   UFHV = '.MT.MS.GO.MG.ES.RJ.SP.PR.SC.RS.DF.';  
33:  var  
34:   dia: word;  
35:   mes: word;  
36:   ano: word;  
37:   anoInicio: integer;  
38:   anoFim: integer;  
39:  begin  
40:   DecodeDate(dataHora, ano, mes, dia);  
41:    
42:   { Mês de inicio do horário de verão: Outubro;  
43:    Mês de fim do horário de verão: Fevereiro;  
44:    
45:    * Se a data verificada for de um mês menor que outubro: Ex: 10/08/2010 (Agosto)  
46:      O inicio do horário de verão será OUTUBRO do ano anterior (10/2009);  
47:      O fim do horário de verão será FEVEREIRO do mesmo ano (02/2010);  
48:    
49:    * Se a data verificada for de um mês maior ou igual outubro: Ex: 10/11/2010 (Novembro)  
50:      O inicio do horário de verão será OUTUBRO do mesmo ano (10/2010);  
51:      O fim do horário de verão será FEVEREIRO do ano seguinte (02/2011);   }  
52:    
53:   anoInicio := ano;  
54:   anoFim := ano;  
55:   if mes < 10 then  
56:    anoInicio := ano - 1  
57:   else  
58:    anoFim := ano + 1;  
59:    
60:   Result := False;  
61:   if (GetInicioDoHorarioDeVerao(anoInicio) <= dataHora) and  
62:     (GetFimDoHorarioDeVerao(anoFim) >= dataHora) and  
63:     (AnsiPos(UF, UFHV) > 0) then  
64:    Result := True;  
65:     
66:  end;  
67:    
68:  function GetInicioDoHorarioDeVerao(const ano: Integer): TDateTime;  
69:  begin  
70:   {O inicio do horário de verão é no terceiro domingo do mes de outubro}  
71:   Result := GetTerceiroDomingoDoMes(ano, 10);  
72:  end;  
73:    
74:  function GetTerceiroDomingoDoMes(const ano, mes: Integer): TDateTime;  
75:  var  
76:   i: integer;  
77:  begin  
78:   {O laço vai até 7 pois até o dia 7 tem que ter passado pelo menos um domingo.  
79:    Achado o primeiro domingo, é somado a ele 14 dias para encontrar o terceiro domingo.}  
80:   result := 0;  
81:   for i := 1 to 7 do begin  
82:    if DayOfWeek(EncodeDate(ano, mes, i)) = 1 then  
83:     begin  
84:      result := EncodeDate(ano, mes, i + 14);  
85:      break;  
86:     end;  
87:   end;  
88:  end;  
89:    
90:  function GetFimDoHorarioDeVerao(const ano: Integer): TDateTime;  
91:  var  
92:   domingoCarnaval: TDateTime;  
93:   terceiroDomingoFevereiro: TDateTime;  
94:  begin  
95:   domingoCarnaval := getDataDoCarnaval(ano) - 2; //Carnaval é na terça - 2 = Domingo  
96:   terceiroDomingoFevereiro := getTerceiroDomingoDoMes(ano, 2);  
97:   if domingoCarnaval <> terceiroDomingoFevereiro then  
98:    result := terceiroDomingoFevereiro  
99:   else  
100:    result := IncDay(terceiroDomingoFevereiro, 7);  
101:  end;  

Nenhum comentário:

Postar um comentário