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; SERVER_REPLY_TIME = 40; 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);
NTPData[0] := $1B;
UDPClient.Connect;
UDPClient.SendBuffer(NTPData);
UDPClient.ReceiveTimeout := 3000;
UDPClient.ReceiveBuffer(NTPData);
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);
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;