我正在使用TidSNTP来获取时间服务器和本地时钟时间之间的调整时间。在Windows上,它可以达到我的期望:
将时间服务器的日期时间从UTC转换为本地时间
从本地时间服务器的日期时间中减去我的时钟时间
但是,在我的android设备上,发生了一些不同的事情:
服务器的日期时间返回为UTC时间,而不是本地时间
调整时间作为我从(UTC * 2)+调整时间的本地偏移量返回
其他人有没有经历过?有什么建议吗?
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;
最佳答案
如果要使用TIdSNTP
实际同步时钟,则应调用TIdSNTP.SyncTime()
,这是为您处理偏移量的方法。
话虽这么说,我认为TIdSNTP.DateTime
应该以当地时间而不是UTC表示。在内部,使用Indy的IdGlobalProtocols.TimeZoneBias()
函数调整日期/时间值,该函数在除基于Unix的系统(包括Android)以外的所有平台上返回-OffetFromUTC()
,在该平台上,它使用与OffsetFromUTC()
相同的逻辑手动计算偏移量返回,因此结果与-OffsetFromUTC()
返回的结果相反。我觉得这有点奇怪。 TimeZoneBias()
应该在所有平台上无条件地使用-OffsetFromUTC()
。
尝试编辑Indy的IdGlobalProtocols.pas
文件,以使TimeZoneBias()
在所有平台上返回-OffsetFromUTC()
,然后重新编译Indy(或至少将已编辑的文件添加到您的项目中),看看问题是否消失了:
function TimeZoneBias: TDateTime;
{$IFDEF USE_INLINE} inline; {$ENDIF}
begin
Result := -OffsetFromUTC;
end;