Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Detectar Cambio manual de hora (https://www.clubdelphi.com/foros/showthread.php?t=98026)

jhonalone 17-04-2026 15:13:54

Detectar Cambio manual de hora
 
Hola, compañeros.

No sé si me equivoco, pero desde la aparición de ChatGpt el club tiene menos actividad.
Yo también he preguntado a la máquina por el título del post.

Pero la máquina dice que a partir de Android 8+ ya no se eminen Broadcasts de esta actividad.

Puesto que las personas tenemos más inventiva, me dirijo a vosotros para pediros que (si alguien tiene algún truco para esto) comparta con los "sufridores" de Android su hallazgo.

Gracias de antemano.
Gran saludo a todos.

Casimiro Noteví 17-04-2026 16:36:58

Puedes comprobar la fecha/hora actual de cualquier servidor NTP, o del servidor de la red, etc. depende de tu necesidad, por ejemplo, este enlace te devuelve la hora y fecha actual:
Cita:

20260417163546
En cuanto a lo que comentas de la actividad de clubdelphi, debes tener en cuenta que tras tantos años acumulando información, prácticamente encuentras todo lo que necesites, así que no es necesario preguntar casi nunca.

jhonalone 17-04-2026 16:51:47

Muchas Gracias, Casimiro por tu rápida respuesta. pero es en Android 8+ donde necesito detectar el cambio de hora y, a ser pòsible enviarlo con un Intent a mi app.

Casimiro Noteví 17-04-2026 17:07:22

Creo que no he entendido, ¿quiéres detectar que han cambiado la fecha/hora del dispositivo android o de algún otro ordenador?
¿Tu aplicación está en el dispositivo android?
Si es así, entonces justo lo que he he comentado, desde tu propia aplicación llamas al servidor de fechahora y compruebas lo devuelto con la que tiene tu dispositivo.

Casimiro Noteví 17-04-2026 17:10:01

Algo más o menos como esto:
Código Delphi [-]
var
  t0, t1: TDateTime;
  respuesta: string;
  horaServidor: TDateTime;
  horaLocalAprox: TDateTime;
  diferencia: Double;
begin
  t0 := Now;

  respuesta := NetHTTPClient1.Get('https://intitec.com/debug/getahora.php').ContentAsString;

  t1 := Now;

  horaServidor := StrToDateTime(respuesta);

  horaLocalAprox := (t0 + t1) / 2;

  diferencia := (horaServidor - horaLocalAprox) * 86400; // segundos

  if Abs(diferencia) > 60 then
    ShowMessage('Hora manipulada');
end;

jhonalone 17-04-2026 20:42:34

Gracias de nuevo por el código.

Lo puse en OnCreate y compila bien, pero me tira la app en el arranque.
Llevo un rato dando vueltas, pero no consigo averiguar la causa. Es una aplicación Android14
Un saludo.

dani36652 17-04-2026 21:32:16

Cita:

Empezado por jhonalone (Mensaje 572293)
Gracias de nuevo por el código.

Lo puse en OnCreate y compila bien, pero me tira la app en el arranque.
Llevo un rato dando vueltas, pero no consigo averiguar la causa. Es una aplicación Android14
Un saludo.

Que onda amigazo... tu app se rompe por que Android emite una excepción de tipo ANR "Android No Responde" al ejecutar procesos pesados en el hilo principal, te sugiero usar siempre Threads para procesos pesados NO VISUALES en android como consumir webservices, peticiones hhtp, etc.

Lo qe yo haría en tu caso es:
Código Delphi [-]
 uses
  System.SysUtils, System.Net.HttpClient, System.DateUtils;

function HoraLocalManipulada: Boolean;
var
  HttpClient: TNetHTTPClient;
  t0, t1: TDateTime;
  Respuesta: string;
  HoraServidor: TDateTime;
  HoraLocalAprox: TDateTime;
  Diferencia: Double;
  FS: TFormatSettings;
begin
  Result := False;
  HttpClient := TNetHTTPClient.Create(nil);
  try
    try
      t0 := Now;

      Respuesta := HttpClient.Get('https://intitec.com/debug/getahora.php').ContentAsString(TEncoding.UTF8);
      Respuesta := Trim(Respuesta);

      t1 := Now;

      FS := TFormatSettings.Create;
      FS.DateSeparator := '-';
      FS.TimeSeparator := ':';
      FS.ShortDateFormat := 'yyyy-mm-dd';
      FS.ShortTimeFormat := 'hh:nn:ss';

      if not TryStrToDateTime(Respuesta, HoraServidor, FS) then
        Exit;

      HoraLocalAprox := (t0 + t1) / 2;

      Diferencia := SecondsBetween(HoraServidor, HoraLocalAprox);

      Result := Abs(Diferencia) > 60;
    except
      Result := False;
    end;
  finally
    HttpClient.Free;
  end;
end;


//Forma de uso: 

procedure Algo;
var 
   Thread: TThread;
begin 
   //Puedes mostrar pantalla de carga
   Thread:= TThread.CreateAnonymousThread(procedure
       var 
          HraManipulada: boolean;
       begin 
           HraManipulada:= HoraLocalManipulada;
           TThread.Synchronize(nil, 
           procedure
           begin         
                //Aqui ocultar pantalla de carga o hacerlo en el Evento OnTerminate.
               //Mostrar mensajes, o cualquier cosa que sea meramente visual aquí  
               if HraManipulada = True then 
                  ShowMessage('No le mueva a la hora si no le sabe :P');
           end);
       end);
      Thread.FreeOnTerminate:= True;
      //Thread.OnTerminate := MyOnTerminate (Puedes declararlo así: procedure MyOnTerminate(Sender: TObject);
      Thread.Start;
end;

jhonalone 18-04-2026 11:26:58

Muchas gracias, Dani.
Tú siempre "al quite" tan oportuno y tan perfecto.
Lo pruebo y os cuento.


La franja horaria es GMT +2. Ahora son las 04:07:54.

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