Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
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!!!
Responder Con Cita
  #2  
Antiguo 30-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 30-10-2008 a las 19:42:26.
Responder Con Cita
  #3  
Antiguo 30-10-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
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!!!
Responder Con Cita
  #4  
Antiguo 30-10-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Unhappy 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???
Responder Con Cita
  #5  
Antiguo 30-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Qué bochoorrrrno . La unidad ni siquiera compilaba

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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 30-10-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
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!!!

Última edición por vejerf fecha: 31-10-2008 a las 11:10:30.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como determinar si X Fecha esta en Hor. Verano pero en firebird???? AGAG4 Firebird e Interbase 1 05-04-2008 22:17:33
Como saber si estamos conectados a internet JF Sebastian Internet 3 17-01-2007 13:59:06
Ajustes de horario Javier_A Varios 1 30-06-2004 13:31:18
Detectar Horario Verano/Invierno Javinho Varios 5 10-06-2004 16:40:24


La franja horaria es GMT +2. Ahora son las 23:17:35.


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
Copyright 1996-2007 Club Delphi