Ver Mensaje Individual
  #2  
Antiguo 30-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
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