我使用TidSNTP获取时间服务器和本地时钟时间之间的调整时间。在Windows上,它做了我期望的事情:
然而,在我的android设备上,发生了一些不同的事情:
还有其他人经历过吗?有什么建议吗?
SNTP := TIdSNTP.Create(Self);
try
SNTP.ReceiveTimeout := 5000;
SNTP.Host := 'time.nist.gov';
try
DateTime := SNTP.DateTime;
TimeOffset := SNTP.AdjustmentTime;
SNTPFailed := False;
except
SNTPFailed := True;
end;
SNTP.Active := False;
finally
SNTP.DisposeOf;
SNTP := Nil;
end;
发布于 2014-08-27 18:02:42
如果要使用TIdSNTP
实际同步时钟,则应该调用TIdSNTP.SyncTime()
,这是为了处理偏移量。
话虽如此,我认为TIdSNTP.DateTime
应该在当地时间表达,而不是UTC。在内部,日期/时间值使用Indy的IdGlobalProtocols.TimeZoneBias()
函数进行调整,该函数在所有平台上返回-OffetFromUTC()
,但基于Unix的系统(包括Android)除外,后者使用OffsetFromUTC()
返回的相同逻辑手动计算偏移量,因此结果与-OffsetFromUTC()
返回的结果相反。我觉得有点奇怪。TimeZoneBias()
可能应该无条件地在所有平台上使用-OffsetFromUTC()
。
尝试编辑Indy的IdGlobalProtocols.pas
文件,使TimeZoneBias()
在所有平台上返回-OffsetFromUTC()
,然后重新编译Indy(或者至少将编辑的文件添加到项目中),看看您的问题是否消失:
function TimeZoneBias: TDateTime;
{$IFDEF USE_INLINE} inline; {$ENDIF}
begin
Result := -OffsetFromUTC;
end;
https://stackoverflow.com/questions/25532404
复制相似问题