Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Controles fecha/hora (https://www.clubdelphi.com/foros/showthread.php?t=96967)

ermendalenda 02-11-2024 20:07:39

Controles fecha/hora
 
Supongo que alguno ya lo habéis pensado.
Voy a meter un control de tiempo de que el registro que se genera no puede ser en fechs hora anterior al anterior. Y por si acaso no hay registros que sea superior a hoy 2/11/2024 o o lo metáis en algún parámetro del sistema. Esto mete una capa más de seguridad en los programas de escritorio en los que existen, remotas pero posibles, situaciones en los que puede pasar:
1. Que a raiz de un corte de luz, el equipo tenga gastada la pila y vuelva a una fecha anterior y no haya conexión a Internet, con lo cual no puede sincronizar con ningún reloj.
2. Que al primo del dueño del restaurante, Ramiro, le pregunten como hacer una factura con fecha anterior y como se está sacando un módulo de ofimática online en CCC es un genio. Entonces el tío vá y le quita Internet al equipo y le cambia la fecha al ordenador emite la factura, con su QR chulo y se pega el moco y ahora llama al servicio técnico para que haga una subsanacion de esto, a ver como te lo comes.
Lo primero es guardar una log de este cambio de fecha, y después bloquear emisiones de facturas.

ermendalenda 03-11-2024 13:12:30

Ojofaq Aeat/veri*factu
 
No sé si es aconsejable marcar como incidencia los cambios de fecha de envío ejemplo se genera el registro a las 23:59
Se envía a las 00:00
Esto no queda claro con lo que dicen.

Cita:

La fecha de expedición de la factura debe coincidir con la de generación del registro de facturación. Ambas fechas, generalmente deben corresponderse con la fecha en que se remite el Registro de facturación. No obstante, se pueden dar situaciones puntuales de no coincidencia, de la fecha de generación del registro con la de envío (por ejemplo, incidencia al remitir que obliga a reintentar más adelante, cambio de horario de verano/invierno...).

Un mayor detalle puede encontrarse en las reglas de validación que afecten a los campos del registro de facturación y del mensaje de remisión a la AEAT .

Neftali [Germán.Estévez] 04-11-2024 10:18:38

Cita:

Empezado por ermendalenda (Mensaje 559177)
Supongo que alguno ya lo habéis pensado.
Voy a meter un control de tiempo de que el registro que se genera no puede ser en fechs hora anterior al anterior. Y por si acaso no hay registros que sea superior a hoy 2/11/2024 o o lo metáis en algún parámetro del sistema.


Nosotros sí tenemos un control similar de control de fechas. Para que no puedan meter una factura con fecha anterior a la última introducida (a nuestros clientes se les ocurren cosas muy raras). Cambios de fecha del equipo, por ejemplo.

AlfredoSanz 04-11-2024 14:44:21

Holaqtal.

Yo me inclino por verificar la fecha del sistema mediante un webservice antes de hacer el envío, de esta forma nos aseguramos de que "mi vecino Jose" no ha tocado nada.

He estado probando worldtimeapi.org, pero muchas veces no me responde.

¿Alguien sabe de algún servicio similar?

novatico 04-11-2024 15:11:32

Cita:

Empezado por AlfredoSanz (Mensaje 559225)
Holaqtal.

Yo me inclino por verificar la fecha del sistema mediante un webservice antes de hacer el envío, de esta forma nos aseguramos de que "mi vecino Jose" no ha tocado nada.

He estado probando worldtimeapi.org, pero muchas veces no me responde.

¿Alguien sabe de algún servicio similar?


Prueba http://date.jsontest.com, es más sencillo pero puede servir.
El servicio de worldtimeapi.org empezó a tener fallos/esperas aleatorias desde que, creo que en Septiembre, se produjo aquella caída masiva de Microsoft. Desde entonces, algunos días funciona perfectamente, y otros se producen esperas muy largas. En mi caso, esto lo he detectado principalmente por las tardes.

ermendalenda 04-11-2024 15:21:36

Cita:

Empezado por AlfredoSanz (Mensaje 559225)
Holaqtal.

Yo me inclino por verificar la fecha del sistema mediante un webservice antes de hacer el envío, de esta forma nos aseguramos de que "mi vecino Jose" no ha tocado nada.

He estado probando worldtimeapi.org, pero muchas veces no me responde.

¿Alguien sabe de algún servicio similar?

Sí, está fallando, pero le he metido hasta 10 reintentos y funciona.
De todas formas le dalta una capa más de seguridad, que es a lo que me refiero, y es si le quitan el cable de Red para que no lea la fecha/hora de Internet, supongo que tu aplicación si es de escritorio seguirá funcionando.para ese caso proponía qu se compararse la fecha/hora del registro anterior que no sea mayor que la actual del sistema.

Neftali [Germán.Estévez] 04-11-2024 15:56:32

Nosotros para temas "serios" pedimos la Fecha/hora al servidor de Base de Datos (en nuestro caso un SQLServer).
Ese servidor no suelen administrarlo los clientes y no pueden "tocarlo" y a los que lo administran ellos no se atreven, porque si cambiasen eso dejaría de funcionar TODA la aplicación.

Para otros temas sin importancia sí que cogemos la del equipo cliente (como os he dicho), pero sabemos que alguno ya ha probado a cambiarla.

ermendalenda 04-11-2024 15:59:20

Gracias, también había pensado hacer una segunda consulta a un servidor propio y así contrasto que si la fecha/hora del sistema es una de las 2, la del servidor público de hora o la del nuestro, la dé por válida. Ya que puede ocurrir que alguno falle y el desastre es monumental, pero así meto triple seguridad.

bmfranky 04-11-2024 16:13:49

Cita:

Empezado por ermendalenda (Mensaje 559228)
Sí, está fallando, pero le he metido hasta 10 reintentos y funciona.
De todas formas le dalta una capa más de seguridad, que es a lo que me refiero, y es si le quitan el cable de Red para que no lea la fecha/hora de Internet, supongo que tu aplicación si es de escritorio seguirá funcionando.para ese caso proponía qu se compararse la fecha/hora del registro anterior que no sea mayor que la actual del sistema.

Si, algo asi he implementado yo, cuando cargo los datos de la huella del ultimo registro enviado, compruebo que la fecha hora de uso no sea posterior a la del sistema, si es asi, cancelo la exportacion de la factura, antes de realizar envios ni asientos de la factura.
Código:

if (DateTime.Parse(huellaAnterior.FechaHoraUso) > DateTime.Now)// si la fecha de uso es posterior a la del sistema...
                {
                    MessageBox.Show("La fecha del sistema es anterior a la del ultimo registro enviado, se cancelara el envio hasta que se subsane la incidencia.", "Atencion.");
                    return;//<-cancelamos la funcion.
                }


ermendalenda 04-11-2024 17:11:54

Cita:

Empezado por bmfranky (Mensaje 559236)
Si, algo asi he implementado yo, cuando cargo los datos de la huella del ultimo registro enviado, compruebo que la fecha hora de uso no sea posterior a la del sistema, si es asi, cancelo la exportacion de la factura, antes de realizar envios ni asientos de la factura.
Código:

if (DateTime.Parse(huellaAnterior.FechaHoraUso) > DateTime.Now)// si la fecha de uso es posterior a la del sistema...
                {
                    MessageBox.Show("La fecha del sistema es anterior a la del ultimo registro enviado, se cancelara el envio hasta que se subsane la incidencia.", "Atencion.");
                    return;//<-cancelamos la funcion.
                }


Así es pero yo le dejaría unos segundos de margen para emitir una factura unos segundos antes (20 o 30 segundos) por lo que. Pueda pasar con la sincronizacion de la hora

bmfranky 04-11-2024 17:55:30

Cita:

Empezado por ermendalenda (Mensaje 559238)
Así es pero yo le dejaría unos segundos de margen para emitir una factura unos segundos antes (20 o 30 segundos) por lo que. Pueda pasar con la sincronizacion de la hora

Hombre, no puede ser que la hora actual sea ni un segundo "Anterior" a la del registro ya enviado, posteior , o descuadrada del servidor de la aeat, podria ser, por eso , cuando implementen las funciones de consulta de registros anteriores, como en la respuesta se incluira el timestamp de hacienda, ahi si que verificare que la hora del sistema no se descuadre mucho de la de hacienda, por ejemplo consultando el ultimo registro enviado antes de empezar a facturar, o al cargar el SIF.

ermendalenda 04-11-2024 17:58:46

Cita:

Empezado por bmfranky (Mensaje 559241)
Hombre, no puede ser que la hora actual sea ni un segundo "Anterior" a la del registro ya enviado, posteior , o descuadrada del servidor de la aeat, podria ser, por eso , cuando implementen las funciones de consulta de registros anteriores, como en la respuesta se incluira el timestamp de hacienda, ahi si que verificare que la hora del sistema no se descuadre mucho de la de hacienda, por ejemplo consultando el ultimo registro enviado antes de empezar a facturar, o al cargar el SIF.

Sí, es mejor no dejar hacer ningún registro, es cierto que si pasara lo de la sincronizacion, y si fuera por unos segundos, en cuanto vuelva a intentarlo ya le dejaría. A mi me puede pasar por que yo sincronizo desee el programa y solo lo reguló si hay una diferencia de 20 segundos. Pero si hago como dices, al momento me va a dejar de nuevo cerrar facturas

edari 04-11-2024 18:41:06

Cita:

Empezado por novatico (Mensaje 559226)
Prueba http://date.jsontest.com, es más sencillo pero puede servir.
El servicio de worldtimeapi.org empezó a tener fallos/esperas aleatorias desde que, creo que en Septiembre, se produjo aquella caída masiva de Microsoft. Desde entonces, algunos días funciona perfectamente, y otros se producen esperas muy largas. En mi caso, esto lo he detectado principalmente por las tardes.

A mí me funciona a veces mal worldtimeapi... habrá que empezar a descartarlo
Pruebo este a ver pero me da hora inglesa...habrá que pasar algún parámetro?
Conocéis algún otro que informe también de la zona horaria?

Gracias

ermendalenda 05-11-2024 07:26:07

Cita:

Empezado por novatico (Mensaje 559226)
Prueba http://date.jsontest.com, es más sencillo pero puede servir.
El servicio de worldtimeapi.org empezó a tener fallos/esperas aleatorias desde que, creo que en Septiembre, se produjo aquella caída masiva de Microsoft. Desde entonces, algunos días funciona perfectamente, y otros se producen esperas muy largas. En mi caso, esto lo he detectado principalmente por las tardes.

Hola
Estoy probando el servicio. Sabía si siempre devuelve 1 hora menos, o cambia en verano?
Gracias

rci 05-11-2024 09:12:57

Yo trabajo en c#.net y utilizo servidores ntp (Network Time Protocol) para consultar la hora en internet, ahora mismo uso time.windows.com pero creo que hay muchos mas servidores de este tipo.
Devuelve la fecha y hora UTC y luego la convierto en la hora local
No se si serviría para delphi

bmfranky 05-11-2024 09:16:13

Cita:

Empezado por rci (Mensaje 559248)
Yo trabajo en c#.net y utilizo servidores ntp (Network Time Protocol) para consultar la hora en internet, ahora mismo uso time.windows.com pero creo que hay muchos mas servidores de este tipo.
Devuelve la fecha y hora UTC y luego la convierto en la hora local
No se si serviría para delphi

Hola, puedes pasar el codigo que usas para la consulta?
Yo uso esta Que devuelbe un json con todos los datos incluyendo el desfase UTC, basado en la ip, mirad el ejemplo.

Cita:

utc_offset"+01:00"timezone"Europe/Madrid"day_of_week2day_of_year310datetime"2024-11-05T09:13:09.623438+01:00"utc_datetime"2024-11-05T08:13:09.623438+00:00"unixtime1730794389raw_offset3600week_number45dstfalseabbreviation"CET"dst_o ffset0dst_fromnulldst_untilnullclient_ip"79.108.205.131"

rci 05-11-2024 09:22:44

Cita:

Empezado por bmfranky (Mensaje 559249)
Hola, puedes pasar el codigo que usas para la consulta?
Yo uso esta
Que devuelbe un json con todos los datos incluyendo el desfase UTC, basado en la ip, mirad el ejemplo.


Lo saqué de internet: https://stackoverflow.com/questions/...server-using-c

Es posible que se pueda mejorar pero de momento uso este:

Código:

      private static DateTime GetNetworkTime()
      {
          //default Windows time server
          const string ntpServer = "time.windows.com";

          // NTP message size - 16 bytes of the digest (RFC 2030)
          var ntpData = new byte[48];

          //Setting the Leap Indicator, Version Number and Mode values
          ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

          var addresses = Dns.GetHostEntry(ntpServer).AddressList;

          //The UDP port number assigned to NTP is 123
          var ipEndPoint = new IPEndPoint(addresses[0], 123);
          //NTP uses UDP

          using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
          {
              socket.Connect(ipEndPoint);

              //Stops code hang if NTP is blocked
              socket.ReceiveTimeout = 3000;

              socket.Send(ntpData);
              socket.Receive(ntpData);
              socket.Close();
          }

          //Offset to get to the "Transmit Timestamp" field (time at which the reply
          //departed the server for the client, in 64-bit timestamp format."
          const byte serverReplyTime = 40;

          //Get the seconds part
          ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

          //Get the seconds fraction
          ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

          //Convert From big-endian to little-endian
          intPart = SwapEndianness(intPart);
          fractPart = SwapEndianness(fractPart);

          var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

          //**UTC** time
          var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

          return networkDateTime.ToLocalTime();
      }

      // stackoverflow.com/a/3294698/162671
      private static uint SwapEndianness(ulong x)
      {
          return (uint)(((x & 0x000000ff) << 24) +
                          ((x & 0x0000ff00) << 8) +
                          ((x & 0x00ff0000) >> 8) +
                          ((x & 0xff000000) >> 24));
      }


mqm 05-11-2024 11:55:51

Aqui teneis en codigo en delphi 11.

Código Delphi [-]
unit VerificaFecha;
interface

uses
  IdUDPClient, IdGlobal, SysUtils, DateUtils;

function GetNetworkTime: TDateTime;

implementation

function SwapEndianness(Value: UInt32): UInt32;
begin
  Result := ((Value and $000000FF) shl 24) or
            ((Value and $0000FF00) shl 8) or
            ((Value and $00FF0000) shr 8) or
            ((Value and $FF000000) shr 24);
end;

function GetNetworkTime: TDateTime;
const
  NTP_SERVER = 'time.windows.com';
  NTP_PORT = 123;
  NTP_PACKET_SIZE = 48;
  NTP_TIMESTAMP_OFFSET = 2208988800; // Seconds between 1900 and 1970
  SERVER_REPLY_TIME = 40; // Offset to "Transmit Timestamp"
var
  UDPClient: TIdUDPClient;
  NTPData: TIdBytes;
  Seconds, Fraction: UInt32;
  UnixTime: UInt64;
begin
  UDPClient := TIdUDPClient.Create(nil);
  try
    UDPClient.Host := NTP_SERVER;
    UDPClient.Port := NTP_PORT;
    UDPClient.BufferSize := NTP_PACKET_SIZE;

    SetLength(NTPData, NTP_PACKET_SIZE);
    FillChar(NTPData[0], NTP_PACKET_SIZE, 0);

    // Set LI, VN, Mode
    NTPData[0] := $1B;

    // Send request
    UDPClient.Connect;
    UDPClient.SendBuffer(NTPData);

    // Receive response
    UDPClient.ReceiveTimeout := 3000;
    UDPClient.ReceiveBuffer(NTPData);

    // Extract timestamp
    Seconds := SwapEndianness(PCardinal(@NTPData[SERVER_REPLY_TIME])^);
    Fraction := SwapEndianness(PCardinal(@NTPData[SERVER_REPLY_TIME + 4])^);

    UnixTime := Seconds - NTP_TIMESTAMP_OFFSET;
    Result := UnixDateDelta + UnixTime / SecsPerDay;
    Result := Result + (Fraction / High(UInt32) / SecsPerDay);

    // Convert to local time
    Result := TTimeZone.Local.ToLocalTime(Result);
  finally
    UDPClient.Free;
  end;
end;

end.

Y ejemplo de llamada :
procedure TForm3.Button1Click(Sender: TObject);
var
  NetworkTime: TDateTime;
begin
  try
    NetworkTime := GetNetworkTime;
    ShowMessage('La hora de red es: ' + DateTimeToStr(NetworkTime));
  except
    on E: Exception do
      ShowMessage('Error al obtener la hora de red: ' + E.Message);
  end;
end;

Neftali [Germán.Estévez] 05-11-2024 12:14:52

Cita:

Empezado por mqm (Mensaje 559256)
Aqui teneis en codigo en delphi 11.


Por favor, añadid TAG's cuando pongáis código en los mensajes.
Para los nuevos en los foros, la recomendación es leer la Guía de estilo de los foros.

adolphsys 05-11-2024 12:44:36

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 559200)
Nosotros sí tenemos un control similar de control de fechas. Para que no puedan meter una factura con fecha anterior a la última introducida (a nuestros clientes se les ocurren cosas muy raras). Cambios de fecha del equipo, por ejemplo.

Pues, al menos con los servidores de prueba Verifactu, están admitiendo remitir una factura con fecha anterior a la última... :confused:

adolphsys 05-11-2024 12:50:32

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 559200)
Nosotros sí tenemos un control similar de control de fechas. Para que no puedan meter una factura con fecha anterior a la última introducida (a nuestros clientes se les ocurren cosas muy raras). Cambios de fecha del equipo, por ejemplo.

Pues, al menos con los servidores de prueba Verifactu, están admitiendo remitir una factura con fecha anterior a la última... :confused:

edari 06-11-2024 09:48:55

Cita:

Empezado por adolphsys (Mensaje 559264)
Pues, al menos con los servidores de prueba Verifactu, están admitiendo remitir una factura con fecha anterior a la última... :confused:


Y también están admitiendo dos envíos diferentes en menos de un minuto...quería yo comprobar el error antes de programar el "delay" para el siguiente envío y nanai...lo traga como un campeón


En cualquier caso me pongo a ello

ermendalenda 06-11-2024 10:05:36

Cita:

Empezado por edari (Mensaje 559314)
Y también están admitiendo dos envíos diferentes en menos de un minuto...quería yo comprobar el error antes de programar el "delay" para el siguiente envío y nanai...lo traga como un campeón


En cualquier caso me pongo a ello

Bueno si, pero cuando repites mucho te meten un delay en la respuesta y se queda colgafa la respuesta el tiempo que le tengas puesto de espera

ermendalenda 06-11-2024 20:01:01

He añadido un nuevo control de fecha (Activable/Desactivable), ultimo registro después del anterior no puede pasar mas de 300 días, si se considera que es correcta esa inactividad del SIF pueden desactivar el control y posteriormente volverlo a activar.


Que obsesión, esto me va a matar!!!

bmfranky 06-11-2024 21:39:07

Cita:

Empezado por ermendalenda (Mensaje 559358)
He añadido un nuevo control de fecha (Activable/Desactivable), ultimo registro después del anterior no puede pasar mas de 300 días, si se considera que es correcta esa inactividad del SIF pueden desactivar el control y posteriormente volverlo a activar.


Que obsesión, esto me va a matar!!!

Hola, por que lo has incluido , es hobligatorio ?

ermendalenda 06-11-2024 21:53:00

Cita:

Empezado por bmfranky (Mensaje 559360)
Hola, por que lo has incluido , es hobligatorio ?

No es obligatorio, tenoa el control de no poder grabar un registro con fecha/hora anterior al último y por lo mismo digo, a ver si un día reconectan un sif que estaba descartado o no está conectado a Internet y le ponen una fecha futura.
300 días sin movimientos es complicado que se dé. Una capa más. Aunque no te lo creas alguna vez después de una caída de luz al reconectar el equipo no le dejaba facturar por fecha antigua pero al ponerle la fecha manualmente le han puesto algún año más. Cuando la conexión a Internet esta ok no hay problema, pero si no...

bmfranky 06-11-2024 21:55:48

Cita:

Empezado por ermendalenda (Mensaje 559363)
No es obligatorio, tenoa el control de no poder grabar un registro con fecha/hora anterior al último y por lo mismo digo, a ver si un día reconectan un sif que estaba descartado o no está conectado a Internet y le ponen una fecha futura.
300 días sin movimientos es complicado que se dé. Una capa más. Aunque no te lo creas alguna vez después de una caída de luz al reconectar el equipo no le dejaba facturar por fecha antigua pero al ponerle la fecha manualmente le han puesto algún año más. Cuando la conexión a Internet esta ok no hay problema, pero si no...

Pues si , me lo creo, la gente es capaz de todo...

ermendalenda 08-11-2024 16:08:17

Ojo con los controles de fecha y hora para los que tengan software en el mercado que puedan trabajar en las madrugadas de los días en que se cambian la hora, qaunque dicen que van a quitar los cambios horarios no paran de retrasarlo
Lo digo para los que tenéis el control puesto de que la siguiente factura no sea de fecha hora a la anterior, si no usáis la hora del meridiano para controlarla claro.

bmfranky 08-11-2024 16:21:36

Cita:

Empezado por ermendalenda (Mensaje 559480)
Ojo con los controles de fecha y hora para los que tengan software en el mercado que puedan trabajar en las madrugadas de los días en que se cambian la hora, qaunque dicen que van a quitar los cambios horarios no paran de retrasarlo
Lo digo para los que tenéis el control puesto de que la siguiente factura no sea de fecha hora a la anterior, si no usáis la hora del meridiano para controlarla claro.

Jova, anda que no te gusta tenerlo todo atado... :D:D:D:D ^\||/

novatico 08-11-2024 16:25:59

Cita:

Empezado por ermendalenda (Mensaje 559480)
Ojo con los controles de fecha y hora para los que tengan software en el mercado que puedan trabajar en las madrugadas de los días en que se cambian la hora, qaunque dicen que van a quitar los cambios horarios no paran de retrasarlo
Lo digo para los que tenéis el control puesto de que la siguiente factura no sea de fecha hora a la anterior, si no usáis la hora del meridiano para controlarla claro.

Yo, para la creación de la factura, sólo voy a tener en cuenta la fecha. Por eso, sólo impido poner fecha factura anterior a la de la última, por supuesto por serie.

Sólo para los registros de facturación voy a usar el datetime ISO 8601

bmfranky 08-11-2024 16:28:08

Cita:

Empezado por novatico (Mensaje 559483)
Yo, para la creación de la factura, sólo voy a tener en cuenta la fecha. Por eso, sólo impido poner fecha factura anterior a la de la última, por supuesto por serie.

Sólo para los registros de facturación voy a usar el datetime ISO 8601

Ahi es dnde vas a tener problema si por una problema x del sistema envias un registro con fecha hora anterior al ultimo enviado.

novatico 08-11-2024 17:40:55

Cita:

Empezado por bmfranky (Mensaje 559484)
Ahi es dnde vas a tener problema si por una problema x del sistema envias un registro con fecha hora anterior al ultimo enviado.

Es que yo no tomo la fecha hora del sistema, sino que la tomo de internet.

Incluso he encontrado la forma de tomar el "unixtime" del ROA (Real Observatorio de la Armada) que es el dato oficial que tomas todos los organismos estatales, incluida la AEAT.
Solo hay que tener en cuenta, además, el desfase por la zona horaria.

Aunque de momento no lo he implementado y lo tomo de "http://date.jsontest.com" al que tambien hay que añadir el desfase de zona.

Es que tengo clientes "muy amigos" de cambiar la fecha y hora del sistema.

bmfranky 08-11-2024 17:43:06

Cita:

Empezado por novatico (Mensaje 559492)
Es que yo no tomo la fecha hora del sistema, sino que la tomo de internet.

Incluso he encontrado la forma de tomar el "unixtime" del ROA (Real Observatorio de la Armada) que es el dato oficial que tomas todos los organismos estatales, incluida la AEAT.
Solo hay que tener en cuenta, además, el desfase por la zona horaria.

Aunque de momento no lo he implementado y lo tomo de "http://date.jsontest.com"

Entonces no tienes problema, tienes la misma hora que ellos, si o si...

ermendalenda 08-11-2024 17:46:47

Cita:

Empezado por novatico (Mensaje 559492)
Es que yo no tomo la fecha hora del sistema, sino que la tomo de internet.

Incluso he encontrado la forma de tomar el "unixtime" del ROA (Real Observatorio de la Armada) que es el dato oficial que tomas todos los organismos estatales, incluida la AEAT.
Solo hay que tener en cuenta, además, el desfase por la zona horaria.

Aunque de momento no lo he implementado y lo tomo de "http://date.jsontest.com" al que tambien hay que añadir el desfase de zona.

Es que tengo clientes "muy amigos" de cambiar la fecha y hora del sistema.

Y podrías poner como haces la petición?

novatico 08-11-2024 17:54:48

Cita:

Empezado por ermendalenda (Mensaje 559497)
Y podrías poner como haces la petición?

Bueno, primero he de recordar algo que ya he comentado en este foro. No uso Delphi, pero estoy por aquí porque es un foro muy activo.
Si tecleas esa dirección http://date.jsontest.com en el navegador, ya vas a ver los datos que devuelve.

Para hacer programáticamente, yo hago un "httpRequest" con orden "GET" y me devuelve el mismo texto que ves en el navegador.
Sólo hay que tomar la información y manejarla, y la respuesta es muy rápida.
Al principio usaba la dirección http://worldtimeapi.org/api/timezone/Europe/Madrid, pero, aunque es más completa, falla en muchas ocasiones.

Os pego el trozo de mi código por si os ayuda:


Código Delphi [-]
        lcURL = "http://date.jsontest.com"
        loHTTP = Createobject("WinHttp.WinHttpRequest.5.1")
        loHTTP.Open("GET", lcURL, .F.)
        loHTTP.Send()

En lcURL va la dirección de más arriba.

Me olvidaba, la respuesta va en:
Código Delphi [-]
cResp = loHTTP.ResponseText

ermendalenda 08-11-2024 17:59:55

Cita:

Empezado por novatico (Mensaje 559501)
Bueno, primero he de recordar algo que ya he comentado en este foro. No uso Delphi, pero estoy por aquí porque es un foro muy activo.
Si tecleas esa dirección "http://date.jsontest.com" en el navegador, ya vas a ver los datos que devuelve.

Para hacer programáticamente, yo hago un "httpRequest" con orden "GET" y me devuelve el mismo texto que ves en el navegador.
Sólo hay que tomar la información y manejarla, y la respuesta es muy rápida.
Al principio usaba la dirección "http://worldtimeapi.org/api/timezone/Europe/Madrid", pero, aunque es más completa, falla en muchas ocasiones.

Os pego el trozo de mi código por si os ayuda:


lcURL = "http://date.jsontest.com"
loHTTP = Createobject("WinHttp.WinHttpRequest.5.1")
loHTTP.Open("GET", lcURL, .F.)
loHTTP.Send()

En lcURL va la dirección de más arriba.

Me olvidaba, la respuesta va en:

cResp = loHTTP.ResponseText

Gracias
Ese lo tengo
Me refiero al de la armada

novatico 08-11-2024 18:33:14

Cita:

Empezado por ermendalenda (Mensaje 559502)
Gracias
Ese lo tengo
Me refiero al de la armada

Creo que es "hora.roa.es"

ermendalenda 08-11-2024 19:26:14

Cita:

Empezado por novatico (Mensaje 559506)
Creo que es "hora.roa.es"

Gracias
Lo miro

bmfranky 08-11-2024 19:38:43

Cita:

Empezado por novatico (Mensaje 559506)
Creo que es "hora.roa.es"

Hola ahora es https://www2.roa.es/hora/

bmfranky 08-11-2024 20:52:08

Funcion Obterner Fechora de internet ROA
 
Hola,despues de leer lo anterior, he adaptado la funcion que tenia para obtener la hora de internet os la paso aqui por si a alguien le interesa, devuelve la hora del Real Instituto y Observatorio de la Armada (ROA)
Hay que instalar el paquete Nugget de criptografia BouncyCastle,


Aqui adaptado para devolver datetime , tened encuenta que devuelve utc

Código:

        /// <summary>
        /// Devuelve la hora actual de internet.
        /// </summary>
        /// <returns>Hora actual formateada.</returns>
        public static DateTime leeFechaHoraInternet()
        {
         
            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);//esta  la uso yo porque tengo bouncy instalado
                    //desde el paquete nuget BouncyCastle
                    return fechora;                             
                }
            }
            catch(Exception Exc)
            {
              return DateTime.Now;
            }
            return DateTime.Now;
        }



La franja horaria es GMT +2. Ahora son las 07:17:21.

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