我正在使用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;

09-25 20:14