Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Detectar Horario Verano/Invierno (https://www.clubdelphi.com/foros/showthread.php?t=10694)

Javinho 26-05-2004 17:42:13

Detectar Horario Verano/Invierno
 
Buenas!
Estoy desarrollando una aplicación en delphi 5.0 y necesito detectar el cambio de horario de verano a invierno y viceversa.
Con un timer miro la hora del sistema cada cierto tiempo. ¿estamos en horario de verano o de invierno?
¿alguien me puede dar una pista?

sanxpue 26-05-2004 19:09:17

Pues eso es segun
 
Por que varia en ciertos Paises, supongamos aqui en Mexico, los del Norti, mas bien unos estados del Norti del pais se pasan por ahi el horario de verano, mi recomendacion seria que fuera a cambio de Fecha no de hora, cuando prendas la maquina y es es la fecha de horario de verano le aumentas una hora y al revez, como la vez... :confused:

roman 26-05-2004 19:32:33

Cita:

Empezado por Javinho
¿estamos en horario de verano o de invierno?

Ahora, en horario de verano. En general quizá te sirva esta función:


Código Delphi [-]
(*
  Devuelve true si Date está dentro del horario
  de verano y false en caso contrario
*)
function WithinDayLight(Date: TDate): Boolean;
var
  tzInfo: TTimeZoneInformation;
  StandardDate: TDate;
  DayLightDate: TDate;

begin
  GetTimeZoneInformation(tzInfo);

  DaylightDate := EncodeDate(
    2004,
    tzInfo.DaylightDate.wMonth,
    tzInfo.DaylightDate.wDay
  );

  StandardDate := EncodeDate(
    2004,
    tzInfo.StandardDate.wMonth,
    tzInfo.StandardDate.wDay
  );

  Result := (Date >= DayLightDate) and (Date < StandardDate);
end;

// Saludos

Javinho 01-06-2004 11:08:05

Hola,
muchas gracias por las respuestas,
utilizando esa función, roman, el cambio de horario de verano a invierno lo hace el 5 de octubre y no el 31 de octubre (último fin de semana de octubre) que es el correcto. Del mismo modo, el cambio de invieno a verano lo hace el 5 de marzo y no el 28 de marzo (último fin de semana de marzo).
No se por qué toma el día 5 como referencia. :confused:
¿es por algo de windows?¿configuración regional?
Seguiré investigando a partir de ahí.
Gracias :)

roman 01-06-2004 16:15:55

La función GetTimeZoneInformation simplemente toma los datos de la configuración regional del sistema de manera que yo empezará revisando ésta.

// Saludos

Javinho 10-06-2004 16:40:24

Ahora si
 
Hola!
Finalmente lo he conseguido así:

Código:



(*
  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;
 
:)

No era un problema de configuración regional.
El problema estaba en el formato que se utilizaba.
No era el 5 de octubre sino el último domingo de octubre.

Copiado de la ayuda de windows de 'GetTimeZoneInformation' (StandarDate)
Cita:

Day-in-month format is specified by setting the wYear member to zero,
setting the wDayOfWeek member to an appropriate weekday,
and using a wDay value in the range 1 through 5 to select the correct day in the month.
Using this notation, the first Sunday in April can be specified,
as can the last Thursday in October (5 is equal to "the last").
;)

Gracias


La franja horaria es GMT +2. Ahora son las 15:53:42.

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