Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como saber si estamos en horario de verano o de invierno (https://www.clubdelphi.com/foros/showthread.php?t=61218)

vejerf 30-10-2008 17:24:24

Como saber si estamos en horario de verano o de invierno
 
Hola a todos,
Estoy desarrollando una aplicación que toma datos de posicionamiento de un gps. La hora que me llega es la hora satelital. La cosa es que en mi aplicación quiero corregirla por lo que en horario de invierno tenemos una descompensación y en horario de verano tenemos otra.
¿Como puedo saber si el sistema tiene el horario de verano o el de invierno?

Gracias!!!

Lepe 30-10-2008 17:50:44

Usa esta unidad:
Código Delphi [-]
unit lpDates;

interface

uses  sysutils, dateutils, Controls, windows;


{------------------------------------------------------------------------------
  hora en que se debe adelantar el reloj : InicioVeranoSpain
  hora en se debe atrasar el reloj: FinVeranoSapin
-------------------------------------------------------------------------------}
function InicioVeranoSpain(Year:Word):TDateTime; // solo para peninsula española
function FinVeranoSpain(Year:Word):TDateTime; // solo para peninsula española

type THorario = (hInvalida, hVerano,hDesconocida, hInvierno);

function EstamosEnhorarioVerano(const TheDate:TDateTime):THorario;

implementation

function InicioVeranoSpain(Year:Word):TDateTime; // solo para peninsula española
var Week:Word;
begin
  Result:= EncodeDateTime(Year, 1, 1,23,59,59,999);
  Week := 6; // preguntamos si el mes tiene 6 semanas

  //  averiguamos el último domingo de marzo
  while not TryEncodeDayOfWeekInMonth(Year,
                                      3, // mes marzo
                                      Week, // ultima semana del mes
                                      7, // domingo
                                      Result)
  do
    Dec(Week);
  Result := RecodeTime(Result,2,0,0,0); // en canarias sería a las 01:00
  // XX/03/XXXX 02:00:00.000
  // en esta fecha se debe adelantar el reloj una hora.end;

function FinVeranoSpain(Year:Word):TDateTime; // solo para peninsula española
var Week:Word;
begin
  Result:= EncodeDateTime(Year, 1, 1,23,59,59,999);
  Week := 6; // preguntamos si el mes tiene 6 semanas

  //  averiguamos el último domingo de octubre
  while not TryEncodeDayOfWeekInMonth(Year,
                                      10, // mes octubre
                                      Week, // ultima semana del mes
                                      7, // domingo
                                      Result)
  do
    Dec(Week);
  Result := RecodeTime(Result ,3,0,0,0); // en canarias sería a las 02:00
  // en esta fecha se debe retrasar el reloj una hora.
end;

function EstamosEnhorarioVerano(const TheDate:TDateTime):THorario;
var ValidStart, ValidFinish:TDateTime;
begin

  ValidStart := RecodeTime(InicioVeranoSpain(yearof(TheDate)),0,0,0,0);
  if (TheDate > InicioVeranoSpain(yearof(TheDate))) and (TheDate < ValidStart) then
  begin
    Result := hInvalida;
    // en cuanto llegue a las 2 de la madrugada, el reloj debe pasar a las 3 de
    // la madrugada, por tanto, si la hora está entre las 2 y las 3, es una
    // fecha incoherente.
  end
  else
  begin
    ValidFinish := RecodeTime(FinVeranoSpain(yearof(TheDate)), 2,0,0,0);
    if (TheDate >= ValidStart) and (TheDate < ValidFinish) then
      Result := hVerano
    else if (TheDate > ValidFinish) and (TheDate < FinVeranoSpain(yearof(thedate))) then
      Result := hDesconocida
      {------------------------------------------------------------------------------
        Como se ha retrasado el reloj una hora, todas las horas entre las
        2 de la madrugada y las 3, puede ser tanto de invierno como
        de verano.
      -------------------------------------------------------------------------------}
    else
      Result:= hInvierno;
  end;
end;

end.

No sé de donde pillé las rutinas, yo lo modifiqué un poco.

Saludos

vejerf 30-10-2008 18:10:18

Muchas gracias Lepe!!!
Aun no la he probado pero supongo que el funcionamiento será tan simple como hacer una llamada a la función EstamosEnHorarioVerano y dependiendo del resultado que me devuelva (hVerano o hInvierno en los casos normales) pues corrijo yo la hora satelital en una o dos horas creo.
Muchas gracias de nuevo!!!:D

vejerf 30-10-2008 18:39:37

Algo falla
 
Hola de nuevo Lepe,
pues resulta que la unidad que me has pasado no va fina del todo. Yo hago lo siguiente:
Código Delphi [-]
procedure ThTimer.ActualizaEstado;
var
  Horario : THorario;
begin
  Horario := EstamosEnhorarioVerano(now);
  if Horario = hVerano then
    PrincipalForm.Texto.Lines.Add('Verano: '+DateTimeToStr(Now))
  else if Horario = hInvierno then
    PrincipalForm.Texto.Lines.Add('Invierno: '+DateTimeToStr(Now))
end;
Pues resulta que ma da ahora como horario de verano. Sim embargo, le cambio la fecha al sistema y le pongo 1 de noviembre por ejemplo y si q me dice q está en horario de invierno.
Noviembre, Diciembre parece ser que es invierno... y más o menos el resto verano!!! q alegria no??? :mad:

Lepe 30-10-2008 19:40:01

Qué bochoorrrrno :o. La unidad ni siquiera compilaba :o

Ya lo he resuelto (edité mi mensaje anterior y lo correjí), los parámetros de TryEncodeDayOfWeekInMonth estaban mal, por eso
InicioVeranoSpain daba la fecha 1/1/1900 y
finveranoSpain daba 30/10/2008

todo lo que estuviera en ese rango, lo daba como verano.

Ahora está correcto:
InicioVeranoSpain da la fecha 30/03/2008 02:00:00 y
finveranoSpain da 26/10/2008 03:00:00

Todas las fechas y horas que se encuentren en ese rango, es precisamente horario de verano.

Saludos y gracias por el aviso.

vejerf 30-10-2008 20:03:04

Quien busca, halla... así dice el refrán... pues buscando buscando encontré esta otra función que de manera muy simple me da lo que buscaba. La dejo para quien le pueda interesar y le doy mil gracias a aquel q la implementó jeje

Código Delphi [-]
(*
Devuelve true si Date está dentro del horario
de verano y false en caso contrario
*)
function EsHorarioVerano(Date: TDate): Boolean;
var
tzInfo: TTimeZoneInformation;
Horario: DWORD;
begin
Horario:= GetTimeZoneInformation(tzInfo);
if Horario = TIME_ZONE_ID_DAYLIGHT then
Result:= True
else
Result:= False;
end;

Y muchas gracias como siempre a ti tb Lepe por tomarte tus molestias!!!


La franja horaria es GMT +2. Ahora son las 11:03:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi