![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Ojo con el TimeStamp de Respuesta
Por si a alguien le sirve:
Ya alguien comentó que el timestamp no lo devuelve si no ha aceptado al menos un registro del lote. Pero, el nuevo tiempo sí o sea, hay que volver a esperar 60 segundos a partir de cuando? Pues no está muy claro, pero me voy a anotar la fecha hora de mi sistema como si fuera el timestamp cuando no haya timestamp de vuelta. |
#2
|
||||
|
||||
Cita:
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#3
|
|||
|
|||
Cita:
|
#4
|
||||
|
||||
Cita:
Código:
/// <summary> /// Devuelve la hora actual formateada con uso horario. /// </summary> /// <returns>Hora actual formateada.</returns> public static string leeFechaHoraInternet() { string retorno = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK"); System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; try { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://www2.roa.es/cgi-bin/horautc");//https://worldtimeapi.org/api/ip"); webRequest.Method = "GET"; HttpWebResponse respuesta = (HttpWebResponse) webRequest.GetResponse(); if(respuesta.StatusCode == HttpStatusCode.OK) { Stream strmRespuesta = respuesta.GetResponseStream(); StreamReader leeRespuesta = new StreamReader(strmRespuesta); string jsonRespuesta = leeRespuesta.ReadToEnd(); long ticks = long.Parse(jsonRespuesta.Replace("\\n", "")); var fechora = Org.BouncyCastle.Utilities.Date.DateTimeUtilities.UnixMsToDateTime(ticks).ToLocalTime();//esta la uso yo porque tengo bouncy instalado //desde el paquete nuget BouncyCastle retorno = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK"); } } catch(Exception Exc) { retorno = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK"); } return retorno; } Puede preguntar a @novatico Cita:
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#5
|
|||
|
|||
Aqua lo tenéis convertido a Delphi 10 y probado. Espero que os sirva
Librerías utilizadas: IdHTTP y IdSSLOpenSSL para manejar la conexión HTTPS. System.DateUtils para trabajar con fechas y convertir ticks Unix a TDateTime. Formato de la fecha: Utiliza FormatDateTime para formatear las fechas en el formato ISO 8601 con zona horaria. Manejo de errores: Si ocurre un error durante la solicitud HTTP, devuelve la hora local en el formato esperado. Conversión de ticks Unix: La API devuelve ticks Unix en milisegundos. Esto se divide entre 1000 para convertirlos a segundos antes de usar UnixToDateTime. Dependencia de OpenSSL: Asegúrate de que tu entorno tenga acceso a las DLL de OpenSSL (libeay32.dll y ssleay32.dll o sus equivalentes actuales) para que TIdSSLIOHandlerSocketOpenSSL funcione correctamente. Última edición por Neftali [Germán.Estévez] fecha: 09-12-2024 a las 09:14:35. Razón: corregir TAGs del código |
#6
|
|||
|
|||
Y esto seria para delphi 7:
Código:
unit Unit2; interface uses Windows, SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils; function LeeFechaHoraInternet: string; implementation function GetTimeZoneOffset: TDateTime; var TZInfo: TTimeZoneInformation; Bias: Integer; begin case GetTimeZoneInformation(TZInfo) of TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_DAYLIGHT: Bias := TZInfo.Bias + TZInfo.DaylightBias; // Ajuste según horario de verano else Bias := 0; // Si no se puede determinar la zona horaria, se asume UTC end; Result := Bias / MinsPerDay; // Convertir minutos a días end; function LeeFechaHoraInternet: string; var Http: TIdHTTP; SSLHandler: TIdSSLIOHandlerSocketOpenSSL; Respuesta: string; UnixTicks: Int64; FechaHoraUTC, FechaHoraLocal: TDateTime; TimeZoneOffset: TDateTime; begin Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Valor predeterminado Http := TIdHTTP.Create(nil); SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); SSLHandler.SSLOptions.Method := sslvTLSv1_2; try Http.IOHandler := SSLHandler; Http.Request.Accept := 'application/json'; Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)'; try // Realizar la solicitud HTTP // Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc'); Respuesta := Http.Get('https://www.google.com'); // Convertir la respuesta (ticks Unix) a DateTime UnixTicks := StrToInt64(Trim(Respuesta)); FechaHoraUTC := UnixDateDelta + (UnixTicks div SecsPerDay) + (UnixTicks mod SecsPerDay) / SecsPerDay; // Obtener el desfase horario TimeZoneOffset := GetTimeZoneOffset; FechaHoraLocal := FechaHoraUTC - TimeZoneOffset; // Devolver la fecha y hora en formato ISO 8601 Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHoraLocal); except on E: Exception do // En caso de error, devolver la hora actual // result := E.Message; Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); end; finally Http.Free; SSLHandler.Free; end; end; end. |
#7
|
|||
|
|||
Hola.
He intentado usar la función pero me sale este error. ¿Sabéis como poder solucionarlo? Error connecting with SSL. error 1409442E:SSL routines:SSL3_READ_BYTES: tlsv 1 alert protocol version Gracias!!!! |
#8
|
|||
|
|||
prueba con este: A mi me funciona correctamente en delphi 7
Código:
unit Unit2; interface uses Windows, SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils; function LeeFechaHoraInternet: string; implementation function GetTimeZoneOffset: TDateTime; var TZInfo: TTimeZoneInformation; Bias: Integer; begin case GetTimeZoneInformation(TZInfo) of TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_DAYLIGHT: Bias := TZInfo.Bias + TZInfo.DaylightBias; // Ajuste según horario de verano else Bias := 0; // Si no se puede determinar la zona horaria, se asume UTC end; Result := Bias / MinsPerDay; // Convertir minutos a días end; function LeeFechaHoraInternet: string; var Http: TIdHTTP; SSLHandler: TIdSSLIOHandlerSocketOpenSSL; Respuesta: string; UnixTicks: Int64; FechaHoraUTC, FechaHoraLocal: TDateTime; TimeZoneOffset: TDateTime; begin Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Valor predeterminado Http := TIdHTTP.Create(nil); SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); try SSLHandler.SSLOptions.Method := sslvTLSv1_2; // Usar TLS 1.2 SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2]; SSLHandler.SSLOptions.Mode := sslmClient; // Modo cliente // Configurar cliente con este manejador SSL // IdHTTP1.IOHandler := SSLHandler; // IdHTTP1.Request.UserAgent := 'Mozilla/5.0'; // Realiza la conexión HTTP/HTTPS // IdHTTP1.Get('https://yourserver.com'); Http.IOHandler := SSLHandler; Http.Request.Accept := 'application/json'; Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)'; try // Realizar la solicitud HTTP Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc'); // Respuesta := Http.Get('https://www.google.com'); // Convertir la respuesta (ticks Unix) a DateTime UnixTicks := StrToInt64(Trim(Respuesta)); FechaHoraUTC := UnixDateDelta + (UnixTicks div SecsPerDay) + (UnixTicks mod SecsPerDay) / SecsPerDay; // Obtener el desfase horario TimeZoneOffset := GetTimeZoneOffset; FechaHoraLocal := FechaHoraUTC - TimeZoneOffset; // Devolver la fecha y hora en formato ISO 8601 Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHoraLocal); except on E: Exception do // En caso de error, devolver la hora actual result := E.Message; // Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); end; finally Http.Free; SSLHandler.Free; end; end; end. |
#9
|
|||
|
|||
Gracias por la respuesta tan rápida.
He probado el código y en la línea "Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');" me sigue saliendo el error. Me da que hay algún problema de compatibilidad de versiones de SSL o algo así. Un saludo. |
#10
|
|||
|
|||
Desactiva el antivirus y prueba
|
#11
|
|||
|
|||
La dll que estoy usando son :ssleay32.dll version 1.0.2.21
libeay32.dll version 1.0.2.21 |
#12
|
|||
|
|||
En delphi con Indy tiene cuatro protocolos distintos para hacerlo de una manera mucho mas sencilla y ademas te sincroniza la hora con el PC.
Os pongo un ejemplo de dos de ellos con TidTimeUDP y TidSNTP:
Última edición por delphiGar fecha: 07-12-2024 a las 14:57:37. |
#13
|
|||
|
|||
Hola.
He probado el código y funciona de maravilla. Solo que hay que ejecutar la aplicación en modo administrador. Seguiré investigando el error "connecting with SSL. error 1409442E:SSL routines:SSL3_READ_BYTES: tlsv 1 alert protocol version" Muchas gracias. |
#14
|
|||
|
|||
Creo que hay una opción en la s propiedades(botón derecho raton) para que siempre se ejecute como administrador o metiendo la aplicación en un .bat y las propiedades del .bat como administrador, alguna vez lo he hecho.
|
#15
|
|||
|
|||
Si en las propiedades del acceso directo, en opciones avanzadas, hay un check para ejecutar como administrador. Pero ¿Habría alguna forma de actualizar la hora del sistema sin entrar como administrador?
. |
#16
|
|||
|
|||
En Windows ¿Porqué no comprobáis que el parámetro "Establecer hora automáticamente" este activado?.
Con eso ya tenéis una capa de seguridad para aseguraos que la hora es correcta. Se puede lograr utilizando llamadas a la API de Windows y accediendo al registro, ya que esta configuración está almacenada allí. La clave relevante del registro es: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters Dentro de esta clave, el valor Type indica cómo se configura la hora del sistema: "NTP" indica que la sincronización automática está activada (Network Time Protocol). "NoSync" indica que no está activada. |
#17
|
|||
|
|||
Cita:
Te lo pongo |
#18
|
|||
|
|||
Cita:
pero en .net hay comandos directos. te pongo como me funciona a mi Generas desde la aplicacion un .bat y le pones estas 3 lineas: "cmd /c Time " & hora_buff "cmd /c date " & date_buff "exit" donde date_buff u hora_buff son las horas capturadas poniendo la fecha en formato español dd/mm/yyyy y despues ejecutas desde el programa: ShellExecute 0, "runas", "[pathcompleto archivo.bat]", requireAdministrator, vbNullString, 0 el shellexexute es de las apis de windows y tienes que declarar esta funcion Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Segun como tengas el windows configurado te puede salir un mensaje de que es una aplicacion externa o algo asi, y le tienes que decir que no te avise mas poniendole al minimo la barra de avisos. Te recomiendo que le pongas un sleep (espera) de 0.5segundos despues de la ejecucion del shellexecute Última edición por ermendalenda fecha: 08-12-2024 a las 11:32:09. |
#19
|
|||
|
|||
Cita:
si lo que quieres es recuperar solo la hora no hace falta el permiso de administrador, lo unico que cuando llames a las funciones, no le indiques True o no indiques nada. El ejecutable puedes ponerlo para que se ejecute en modo administrador desde las opciones del proyecto en el apartado Application -> Manifest -> Execution Level -> Require Adminsitrator Última edición por delphiGar fecha: 08-12-2024 a las 11:32:45. |
#20
|
|||
|
|||
Voy a probar lo que habéis puesto. Qué haríamos sin la ayuda de este foro. Sois los mejores.
Muchas gracias!!!! |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
TimeStamp | Willo | MySQL | 4 | 22-03-2016 21:15:00 |
Consulta TimeStamp | Jose Roman | SQL | 2 | 06-09-2012 04:03:11 |
TimeStamp = TimeStamp me da error | Chogo | Firebird e Interbase | 7 | 16-03-2011 04:13:38 |
TIMESTAMP en restriccion | Cañones | SQL | 6 | 28-08-2007 23:19:27 |
Timestamp y bde 5.2 | Toni | Firebird e Interbase | 2 | 27-05-2003 09:26:33 |
![]() |
|