⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 通过indy datetime控件同步互联网时间服务器的小软件
💻 PAS
字号:
unit Main;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdDayTime;

type
  TMainFrm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    lbCurZone: TLabel;
    lbCurTime: TLabel;
    lbNetTime: TLabel;
    Timer1: TTimer;
    Panel1: TPanel;
    cmdTime: TButton;
    cmdSync: TButton;
    cmdExit: TButton;
    IdDayTime1: TIdDayTime;
    Label4: TLabel;
    cbbTimeSvr: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure cmdTimeClick(Sender: TObject);
    procedure cmdExitClick(Sender: TObject);
  private
    { Private declarations }
    hBias: Integer;
    mBias: Integer;
    function ShowMsg(sMsg: String; Btns: LongInt = mb_Ok+mb_IconError): Integer;
  public
    { Public declarations }
  end;

var
  MainFrm: TMainFrm;

implementation

{$R *.dfm}
{$I TimeSvrs.inc}

procedure TMainFrm.FormCreate(Sender: TObject);
var
  i: Integer;
  tzInfo: Time_Zone_Information;
begin
  Application.Title:=Caption;
  GetTimeZoneInformation(tzInfo);
  //获取当地时区和格林威治的时间差
  hBias:=tzInfo.Bias div 60;
  mBias:=tzInfo.Bias mod 60;
  //显示当地时区
  lbCurZone.Caption:=Trim(tzInfo.DaylightName);
  //显示当前时间
  lbCurTime.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now);
  //初始化时间服务器列表
  for i:=0 to Length(ATimeSvr)-1 do cbbTimeSvr.Items.Append(ATimeSvr[i].Host);
end;

procedure TMainFrm.FormDestroy(Sender: TObject);
begin
//
end;

procedure TMainFrm.FormShow(Sender: TObject);
begin
//
end;

procedure TMainFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//
end;

function TMainFrm.ShowMsg(sMsg: String; Btns: LongInt = mb_Ok+mb_IconError): Integer;
begin
  Result:=Application.MessageBox(PChar(sMsg),PChar(Caption),Btns);
end;

procedure TMainFrm.cmdTimeClick(Sender: TObject);
var
  TimeStr: String;
  SysTime: TSystemTime;
begin
  //服务器地址简单判断
  if Length(cbbTimeSvr.Text)<=5 then
  begin
    ShowMsg('互联网时间服务器无效,请重新输入或选择一个!');
    cbbTimeSvr.SetFocus;
    Exit;
  end;
  //从时间服务器获取时间
  cmdTime.Enabled:=false;
  cmdSync.Enabled:=false;
  try
    IdDayTime1.Host:=cbbTimeSvr.Text;
    TimeStr:=Trim(IdDayTime1.DayTimeStr);
    SysTime.wYear:=StrToInt(Copy(TimeStr,7,2));
    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
    cmdTime.Enabled:=true;
    cmdSync.Enabled:=true;
    ShowMsg(Format('从时间服务器"%s"获取时间失败!',[cbbTimeSvr.Text]));
    Exit;
  end;
  //对获取的时间进行修正
  SysTime.wYear:=SysTime.wYear+2000;
  SysTime.wHour:=SysTime.wHour-hBias;
  SysTime.wMinute:=SysTime.wMinute-mBias;
  //显示当前和互联网当前时间
  lbCurTime.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now);
  lbNetTime.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',SystemTimeToDateTime(SysTime));
  //如果是cmdSync则进行本机时间同步
  if (Sender=cmdSync) then
  begin
    SetLocalTime(SysTime);
    lbCurTime.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now);
    ShowMsg(Format('从时间服务器"%s"同步时间成功!',[cbbTimeSvr.Text]),mb_Ok+mb_IconInformation);
  end;
  cmdTime.Enabled:=true;
  cmdSync.Enabled:=true;
end;

procedure TMainFrm.cmdExitClick(Sender: TObject);
begin
  Close;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -