系統時間與Int網標準時校對
一、獲取標準時間的意義
我們在程式設計時,對於資料的核準,需要與日期時間值,作品校準引數。因此,客戶端時間要與伺服器時間一致,將它們的時間與標準時間一致,是最好的辦法。
二、技術準備
1、系統時間引數,這一引數用於設定本地時間
TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end;
2、 Time_Zone_Information 這是標準時間的引數
3、 GetTimeZoneInformation(tzInfo) 獲取系統當地時間(時區設定)資訊 4、TidDayTime控制元件,該控制元件可以指定Host,獲取標準時間值(字串),IdDayTime1.DayTimeStr,,該字串值格式如下:
58396 18-10-05 05:06:04 31 0 0 691.8 UTC(NIST) *
我們,可以通過該字串,獲取相關日期時間的值。
注意:該字串,只能獲取2位年的值各要加入千位值,如21世紀,就要加入2000.。
我測試過了XE10中的IdDayTime1.DayTimeStr,格式一樣,我就不理解,為何不返回4位年度值呢?新版本改為4位多好啊!
5、SetLocalTime(SysTime) ,設定本地時間(API)
三、實現程式碼如下
function TForm1.getDateTime(Host:string):string; // 與網路上獲取時間並同步 var IdDayTime1: TIdDayTime; tzInfo: Time_Zone_Information; // 系統引數 hBias, // 小時 偏差 mBias: Integer; // 分鐘 偏差 TimeStr:String; // 時間字元 SysTime: TSystemTime; // TSystemTime 是系統定義的結構, 16 個位元組: { TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; } begin GetTimeZoneInformation(tzInfo); // 獲取系統當地時間(時區設定)資訊 hBias:=tzInfo.Bias div 60; // 獲取當地時區和格林威治的小時差 mBias:=tzInfo.Bias mod 60; // 獲取當地時區和格林威治的分鐘差 IdDayTime1:=TIdDayTime.Create(Application); // 建立IdDayTime try IdDayTime1.Host:=Host; // 從熱點獲取時間 TimeStr:=Trim(IdDayTime1.DayTimeStr); // 返回時間字串 Edit5.Text:=IdDayTime1.DayTimeStr; Edit6.Text:=IntTostr(Trunc(Now)); // 下面分別向SysTime分解字串的值 SysTime.wYear:=StrToInt(Copy(TimeStr,7,2)); // 版本問題 年 只取2位 後面要加入2000 SysTime.wMonth:=StrToInt(Copy(TimeStr,10,2)); SysTime.wDay:=StrToInt(Copy(TimeStr,13,2)); SysTime.wHour:=StrToInt(Copy(TimeStr,16,2)); SysTime.wMinute:=StrToInt(Copy(TimeStr,19,2)); SysTime.wSecond:=StrToInt(Copy(TimeStr,22,2)); SysTime.wMilliseconds:=StrToInt(Copy(TimeStr,32,3)); except Showmessage('從獲取時間失敗!'); Exit; end; // 對獲取的SysTime時間值 進行修正 SysTime.wYear:=SysTime.wYear+2000; // 加入日期偏差 SysTime.wHour:=SysTime.wHour-hBias; // 加入小時偏差 SysTime.wMinute:=SysTime.wMinute-mBias; // 加入小時偏差 SetLocalTime(SysTime); // 設定本地時間 Result:=FormatDateTime('yyyy-mm-dd hh:nn:ss zzz',SystemTimeToDateTime(SysTime)); end; procedure TForm1.Button1Click(Sender: TObject); begin IdDayTime1.Host := Edit1.Text; //連線主機 IdDayTime1.Port := StrToIntDef(Edit2.Text,strtoint(Edit2.Text)); //埠 end; procedure TForm1.Button5Click(Sender: TObject); begin Edit1.Text:=getDateTime('time.nist.gov'); end;
四、測試結果,D7和XE10.2中,通過。成功取決於網站的返回率。