2014-08-27 35 views
0

我使用TidSNTP得到一个时间服务器和本地时钟时间之间的调整时间。在Windows上,它做什么,我希望:德尔福TidSNTP的Android

  1. 从UTC转换时间服务器的日期时间为当地时间
  2. 从局部时间服务器的日期时间减去我的时钟的时间

然而,在我的Android设备,不同的东西发生了:

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

回答

0

如果你想实际使用同步TIdSNTP,你应该叫TIdSNTP.SyncTime(),其目的是要处理的偏移量为您的时钟。

话虽这么说,我觉得TIdSNTP.DateTime应该在本地时间,UTC不被表达。在内部,日期/时间值是使用印的IdGlobalProtocols.TimeZoneBias()功能,其上除了基于Unix的系统的所有平台返回-OffetFromUTC()(其包含Android),在那里它代之以计算使用相同的逻辑手动偏移OffsetFromUTC()返回调节,因此,结果是-OffsetFromUTC()会返回的相反。这对我来说似乎有点奇怪。 TimeZoneBias()应该无条件地在所有平台上使用-OffsetFromUTC()

尝试编辑Indy的IdGlobalProtocols.pas文件,以使TimeZoneBias()在所有平台上的回报-OffsetFromUTC(),然后重新编译印地(或至少编辑过的文件添加到您的项目),看看您的问题就会消失:

function TimeZoneBias: TDateTime; 
{$IFDEF USE_INLINE} inline; {$ENDIF} 
begin 
    Result := -OffsetFromUTC; 
end; 
+0

正确的雷米。在Android上下文中,.SyncTime可以调整Android上的时间,但只能在0.14 - 0.17秒之内。 (通过重复的调整和计算检查).adjustmentTime是一个数字,当我处于GMT + 2时区时,对我而言(-4小时)没有意义。 – nolaspeaker 2017-10-04 16:29:22

+0

0.14-0.17秒钟听起来正确。 [RFC 2030](https://tools.ietf.org/html/rfc2030)(其'TIdSNTP'基于)指出:“*这允许一个简单的计算,以确定在服务器和客户端之间的传播延迟* *通常在几十毫秒**相对于服务器*的本地时钟。“至于'AdjustmentTime',它只是返回'FLocalClockOffset'构件,其作为'FLocalClockOffset计算:=((FReceiveTimestamp - FOriginateTimestamp)+(FTransmitTimestamp - FDestinationTimestamp))/ 2;',根据RFC 2030第5 – 2017-10-04 17:45:04

+0

如果你看到2-6小时的值,然后回到我的评论,也许Indy的'TimeZoneBias()'函数在Android上返回错误的值。你是否在我的回答中改变了我的建议?它对原始代码有什么影响吗? – 2017-10-04 17:45:41