系統時間可能因電池耗盡、用戶誤改等原因偏移。互聯網提供多個權威時間服務器(如美國海軍天文台 tick.usno.navy.mil、NIST time.nist.gov),通過標準 Daytime 協議(端口 13) 即可獲取 UTC 時間,無需複雜的 NTP/SNTP 實現,極適合輕量級應用。
:1359094 23-04-15 12:34:56 00 0 0 123.4 UTC(NIST) *)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.com | SGI | 早期知名服務器 |
tick.mit.edu | 麻省理工學院 | 教育網訪問較快 |
注意:不同服務器返回格式可能差異(部分含日期、毫秒、時區標識),解析邏輯需適配。生產環境建議:
ClientSocket1.Timeout)uses Windows;
var ST: TSystemTime;
begin
DateTimeToSystemTime(LocalTime, ST);
SetSystemTime(ST); // 需 SeSystemtimePrivilege
end;
幾十行代碼,即可賦予應用「自動校時」能力,極大提升用戶體驗與數據可信度。