首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 從網絡時間服務器獲取標準時間:基於 TCP 協議的輕量級同步方案

     編輯:Delphi

背景:本地時鐘不可靠,網絡授時來解憂

系統時間可能因電池耗盡、用戶誤改等原因偏移。互聯網提供多個權威時間服務器(如美國海軍天文台 tick.usno.navy.mil、NIST time.nist.gov),通過標準 Daytime 協議(端口 13) 即可獲取 UTC 時間,無需複雜的 NTP/SNTP 實現,極適合輕量級應用。

協議交互流程

  1. 客戶端 TCP 連接服務器 :13
  2. 服務器發送 ASCII 時間字符串(格式如 59094 23-04-15 12:34:56 00 0 0 123.4 UTC(NIST) *)
  3. 客戶端解析時間部分,按時區轉換(北京時間 UTC+8)
  4. 關閉連接,更新界面顯示

Delphi 組件化實現:TClientSocket 一鍵搞定

拖放 TClientSocket(Internet 頁)、TEdit(顯示時間),編寫極簡代碼:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1.Host := 'tick.usno.navy.mil'; // 美國海軍天文台
  ClientSocket1.Port := 13;                   // Daytime 協議標準端口
  ClientSocket1.Open;                         // 異步連接
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  RawTime, TimePart: string;
  H, M, S, MS: Word;
  LocalTime: TDateTime;
begin
  RawTime := Socket.ReceiveText;           // 如 "59094 23-04-15 12:34:56 ..."
  TimePart := Copy(RawTime, 12, 8);        // 提取 "12:34:56"
  DecodeTime(StrToTime(TimePart), H, M, S, MS);
  H := (H + 8) mod 24;                     // UTC 轉北京時間
  LocalTime := EncodeTime(H, M, S, MS);
  Edit1.Text := TimeToStr(LocalTime);      // 顯示
end;

多服務器備選與容錯建議

域名機構備註
tick.usno.navy.mil美國海軍天文台本文示例使用
time.nist.gov美國國家標準技術研究院多 IP 輪換,高可用
clock.sgi.comSGI早期知名服務器
tick.mit.edu麻省理工學院教育網訪問較快

注意:不同服務器返回格式可能差異(部分含日期、毫秒、時區標識),解析邏輯需適配。生產環境建議:

  • 嘗試多台服務器,超時重試(設置 ClientSocket1.Timeout)
  • 解析失敗時記錄日志,不阻塞主界面
  • 網絡延遲導致秒級誤差,非高精度場景(火箭發射級)可忽略

擴展:寫入系統時間(需管理員權限)

uses Windows;
var ST: TSystemTime;
begin
  DateTimeToSystemTime(LocalTime, ST);
  SetSystemTime(ST); // 需 SeSystemtimePrivilege
end;

幾十行代碼,即可賦予應用「自動校時」能力,極大提升用戶體驗與數據可信度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved