program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this }
,SNTPsend
;
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
ErrorMsg: String;
sntp:TSntpSend;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
sntp:=TSntpSend.Create;
try
sntp.TargetHost:='XXX.XXX.XXX.XXX';
if sntp.GetSNTP
then writeln(Datetimetostr(sntp.NTPTime)+' UTC')
else writeln('Not contacted!');
finally
sntp.Free;
end;
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
function TForm1.LeggiDataOra(var WrkDataOra:TDateTime):Boolean;
var sntp :TSNTPSend;
remoteTime:TDateTime;
TimeZone: TTimeZoneInformation;
OreDiff:Integer;
begin
Result:=False;
sntp:=TSNTPSend.Create;
sntp.Timeout:=1000;
sntp.TargetHost:='0.pool.ntp.org';
sntp.SyncTime:=TRUE;
// 'Contacting ' + sntp.TargetHost + ' on port ' +sntp.TargetPort;
try
try
if sntp.GetSNTP then begin
remoteTime:= sntp.NTPTime;
//Determino quante ore aggiungere/togliere in base al fuso orario attuuale
//ed al fatto che sia in vigore l'ora l'ora legale o solare
GetTimeZoneInformation(TimeZone);
OreDiff:=TimeZone.DaylightDate.Hour //Ore di differenza del Fuso Orario
- (TimeZone.Bias div 60) //??????????????
+ (TimeZone.DaylightBias div 60); //Ora legale/solare
Sleep(0);
//Oggi, 01/04/2016, quindi con l'ora legale, i valori di "TimeZone" sono Quelli qui sotto.
// OreDiff vale 2
// P.S. Secondo me, la discriminante da curare, sono i campi con "BIAS" nel nome
{
record _TIME_ZONE_INFORMATION {
BIAS = -60,
STANDARDNAME = 'ora solare Europa occidentale'#0#0,
STANDARDDATE = {
WYEAR = 0,
WMONTH = 10,
WDAYOFWEEK = 0,
WDAY = 5,
WHOUR = 3,
WMINUTE = 0,
WSECOND = 0,
WMILLISECONDS = 0,
YEAR = 0,
MONTH = 10,
DAYOFWEEK = 0,
DAY = 5,
HOUR = 3,
MINUTE = 0,
SECOND = 0,
MILLISECOND = 0},
STANDARDBIAS = 0,
DAYLIGHTNAME = 'ora legale Europa occidentale'#0#0,
DAYLIGHTDATE = {
WYEAR = 0,
WMONTH = 3,
WDAYOFWEEK = 0,
WDAY = 5,
WHOUR = 2,
WMINUTE = 0,
WSECOND = 0,
WMILLISECONDS = 0,
YEAR = 0,
MONTH = 3,
DAYOFWEEK = 0,
DAY = 5,
HOUR = 2,
MINUTE = 0,
SECOND = 0,
MILLISECOND = 0},
DAYLIGHTBIAS = -60} }
//Rettifico l'ora in base al fuso orario attuale
WrkDataOra:=IncHour(remoteTime, OreDiff);
//Memo1.Lines.Add('Remote time is :' + DateTimeToStr(remoteTime)+' UTC');
Result:=True;
end else begin
//Visto che la data non è stata reperita, ci metto dentro l'errore !!!!
WrkDataOra:=sntp.Sock.LastError;
end;
except
On E:Exception do Sleep(0); //Memo1.Lines.Add('Exception ' + E.ClassName + ': ' +E.Message);
end;
finally
sntp.Free;
end;
end;
Ciao,
tempo fa' avevo usato il codice qui sotto, però poi non avevo avuto modo di testarlo con il cambio dell'ora per verificarne l'effettivo funzionamento.
Prova a vedere se ti può essere d'aiuto.Codice: [Seleziona]function TForm1.LeggiDataOra(var WrkDataOra:TDateTime):Boolean;
var sntp :TSNTPSend;
remoteTime:TDateTime;
TimeZone: TTimeZoneInformation;
OreDiff:Integer;
begin
Result:=False;
sntp:=TSNTPSend.Create;
sntp.Timeout:=1000;
sntp.TargetHost:='0.pool.ntp.org';
sntp.SyncTime:=TRUE;
// 'Contacting ' + sntp.TargetHost + ' on port ' +sntp.TargetPort;
try
try
if sntp.GetSNTP then begin
remoteTime:= sntp.NTPTime;
//Determino quante ore aggiungere/togliere in base al fuso orario attuuale
//ed al fatto che sia in vigore l'ora l'ora legale o solare
GetTimeZoneInformation(TimeZone);
OreDiff:=TimeZone.DaylightDate.Hour //Ore di differenza del Fuso Orario
- (TimeZone.Bias div 60) //??????????????
+ (TimeZone.DaylightBias div 60); //Ora legale/solare
Sleep(0);
//Oggi, 01/04/2016, quindi con l'ora legale, i valori di "TimeZone" sono Quelli qui sotto.
// OreDiff vale 2
// P.S. Secondo me, la discriminante da curare, sono i campi con "BIAS" nel nome
{
record _TIME_ZONE_INFORMATION {
BIAS = -60,
STANDARDNAME = 'ora solare Europa occidentale'#0#0,
STANDARDDATE = {
WYEAR = 0,
WMONTH = 10,
WDAYOFWEEK = 0,
WDAY = 5,
WHOUR = 3,
WMINUTE = 0,
WSECOND = 0,
WMILLISECONDS = 0,
YEAR = 0,
MONTH = 10,
DAYOFWEEK = 0,
DAY = 5,
HOUR = 3,
MINUTE = 0,
SECOND = 0,
MILLISECOND = 0},
STANDARDBIAS = 0,
DAYLIGHTNAME = 'ora legale Europa occidentale'#0#0,
DAYLIGHTDATE = {
WYEAR = 0,
WMONTH = 3,
WDAYOFWEEK = 0,
WDAY = 5,
WHOUR = 2,
WMINUTE = 0,
WSECOND = 0,
WMILLISECONDS = 0,
YEAR = 0,
MONTH = 3,
DAYOFWEEK = 0,
DAY = 5,
HOUR = 2,
MINUTE = 0,
SECOND = 0,
MILLISECOND = 0},
DAYLIGHTBIAS = -60} }
//Rettifico l'ora in base al fuso orario attuale
WrkDataOra:=IncHour(remoteTime, OreDiff);
//Memo1.Lines.Add('Remote time is :' + DateTimeToStr(remoteTime)+' UTC');
Result:=True;
end else begin
//Visto che la data non è stata reperita, ci metto dentro l'errore !!!!
WrkDataOra:=sntp.Sock.LastError;
end;
except
On E:Exception do Sleep(0); //Memo1.Lines.Add('Exception ' + E.ClassName + ': ' +E.Message);
end;
finally
sntp.Free;
end;
end;
Ciao, Mario
puoi postare l'intera stringa che ti viene restituita?