1. 程式人生 > >系統時間與Int網標準時校對

系統時間與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中,通過。成功取決於網站的返回率。