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;
quarta-feira, 5 de março de 2014
Horário de Verão - ACBR
Assinar:
Postagens (Atom)