Ver Mensaje Individual
  #26  
Antiguo 12-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 198
Reputación: 11
razorxxx Va por buen camino
Les traigo una pequeña mejora del código de mqm, que permite pasarle el UTC que queramos. Por tanto, independientemente de la fecha, hora y región que tenga el equipo desde el que se ejecuta la aplicación, nos dará siempre la fecha-hora de Internet correcta:

Código Delphi [-]
function TPPRUEBAS.LeerFechaHoraInternet(UTC: Integer): string;
var
   Https: TIdHTTP;
   SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
   Respuesta: string;
   UnixTicks: Int64;
   FechaHora: TDateTime;
begin
     Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
     try
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];  // TLS 1.2 es compatible desde Windows 7 SP1 y Server 2008 R2 SP1, y aún no ha sido descatalogado
        SSLHandler.SSLOptions.Mode := sslmClient;
        Https := TIdHTTP.Create(nil);
        Https.IOHandler := SSLHandler;
        Https.Request.Accept := 'text/html';
        Https.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
        Https.ConnectTimeout := 5000;  // Máximo 5 segundos para establecer la conexión con el servidor
        Https.ReadTimeout := 5000;  // Máximo 5 segundos para obtener la respuesta
        try
           Respuesta := Https.Get('https://www2.roa.es/cgi-bin/horautc');  // Realiza la solicitud a la API del ROA
           UnixTicks := StrToInt64(Trim(Respuesta));  // Si la respuesta viene en formato Unix (ajusta el formato si la API devuelve algo diferente)
           FechaHora := UnixToDateTime(UnixTicks div 1000);  // Divide entre 1000 para convertir milisegundos a segundos
           FechaHora := IncHour(FechaHora, UTC);  // Adaptarlo al huso horario seleccionado en el parámetro UTC: 1 = UTC+1 (Península y Baleares), 0 = UTC+0 (Canarias), etc
           Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);  // Formatear la fecha-hora en el formato aceptado por Veri*Factu
           Consola.Lines.Add('Fecha-hora de internet sincronizada correctamente.');
        except
              on E: Exception do
              begin
                   // En caso de error, retorna la hora local y avisa de ello en la consola
                   Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
                   Consola.Lines.Add('No se pudo sincronizar la fecha-hora de internet. Se muestra la fecha-hora del equipo.');
              end;
        end;
     finally
            If Assigned(Https) Then Https.Free;
            If Assigned(SSLHandler) Then SSLHandler.Free;
     end;
end;
Responder Con Cita