【问题标题】:Delphi TidSNTP Android德尔福 TidSNTP 安卓
【发布时间】:2014-08-27 16:28:24
【问题描述】:

我正在使用 TidSNTP 来获取时间服务器和本地时钟时间之间的调整时间。在 Windows 上,它符合我的预期:

  1. 将时间服务器的日期时间从 UTC 转换为本地时间
  2. 从本地化时间服务器的日期时间中减去我的时钟时间

但是,在我的安卓设备上,发生了一些不同的事情:

  1. 服务器的日期时间返回为 UTC 时间,而不是本地时间
  2. 调整时间返回为我的本地偏移量 (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;

【问题讨论】:

    标签: android delphi indy


    【解决方案1】:

    如果您想使用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;
    

    【讨论】:

    • 正确的雷米。在 Android 上下文中, .SyncTime 确实会调整我的 Android 上的时间,但只能调整到 0.14 - 0.17 秒之内。 (通过反复调整和计算检查)当我处于 GMT+ 2 时区时,.adjustmentTime 是一个对我没有意义的数字(-4 小时)。
    • 0.14-0.17 秒听起来差不多。 RFC 2030TIdSNTP 基于)声明:“这允许通过简单的计算来确定服务器和客户端之间的传播延迟,并通常在几十毫秒内对齐本地时钟 相对于服务器”。至于AdjustmentTime,它只返回FLocalClockOffset 成员,根据RFC 2030 第5 节计算为FLocalClockOffset := ((FReceiveTimestamp - FOriginateTimestamp) + (FTransmitTimestamp - FDestinationTimestamp)) / 2;
    • 如果您看到值相差 2-6 小时,那么这可以追溯到我的评论,即 Indy 的 TimeZoneBias() 函数可能在 Android 上返回了错误的值。您是否对我在回答中推荐的代码进行了更改?它与原始代码有什么不同吗?
    • 我按照您的建议修改了 idGlobalProtocols.pas 并将其添加到我的 Android 项目中。随着更改,idSNTP1.AdjustmentTime 现在小于 0.5 秒,而不是一天的 0.1666 - idSNTP1.DateTime 也在现在的 0.5 秒内(而不是落后一天的 0.1666)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多