2014-08-27 72 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