在delphi中获取internet时间

在delphi中获取internet时间,delphi,datetime,indy,Delphi,Datetime,Indy,我想从网上得到时间和日期 我使用了以下代码 IdDayTime1.ReadTimeout := 5000; IdDayTime1.Host := 'www.time.windows.com'; IdDayTime1.Port := 37 ; Label1.Caption := IdDayTime1.DayTimeStr; 但我得到:套接字错误#11004 这是什么?我做错了什么 我的互联网和其他东西正常套接字错误11004表示“地址不正确”“。您需要去掉www.前缀,正确的地址是tim

我想从网上得到时间和日期

我使用了以下代码

IdDayTime1.ReadTimeout := 5000;
IdDayTime1.Host := 'www.time.windows.com';
IdDayTime1.Port := 37     ;
Label1.Caption := IdDayTime1.DayTimeStr;
但我得到:套接字错误#11004

这是什么?我做错了什么


我的互联网和其他东西正常

套接字错误11004表示“地址不正确”“。您需要去掉www.前缀,正确的地址是time.windows.com

尝试在ntp pool.org服务器上使用Indy ntp客户端组件。如果您有任何问题,我将发布一些示例代码。

协议不是NTP协议。白天使用端口13,而不是37。37由协议使用,而不是NTP协议,NTP协议使用123(UDP)。我不知道time.windows.com是否支持日间和时间协议,现在从可靠时间源获取时间最常用的协议是,它更简单的同级SNTP,它取代了日间和时间协议。

下面是一些简单的代码,展示了idSNTP组件的使用

var
  SNTPClient: TIdSNTP;
begin
  SNTPClient := TIdSNTP.Create(nil);
  try
    SNTPClient.Host := 'pool.ntp.org';
    SNTPClient.SyncTime;
  finally
    SNTPClient.Free;
  end;
end;

如果获得时间和日期,请使用Indy IdSNTP组件并设置:
主机:time.windows.com

和在事件计时器(TTimer组件)上写入:

你们可以在表格(标签1,标签2)上看到现在的日期和现在的时间。所以如果你设定时间同步

put
IdSNTP1.SyncTime事件计时器1计时器。

我同意这一点,我正要自己写一个答案,但后来我发现“time.windows.com”也不能用。可能是防火墙问题?但是Windows防火墙不应该显示弹出消息吗?嘿,谢谢,但还有其他错误:#10060连接超时我已经尝试了好几个时间服务器,但没有人工作,所以至少在time.Windows.com上没有问题。我在网上也试过很多,但没有一个有效,例如“time.nist.gov”,谢谢,我找到了Indy ntp客户端组件,但我还不够成熟,无法使用它们。请发布一些示例。我刚刚尝试了time.windows.com和意大利官方时间(IEN),它可以正常工作。使用Indy 10.5.5实际上,pool.ntp.org是DNS循环,所以生成的时间戳质量随机变化。我知道,但我并不打算将其用于生产代码,只是一个示例。如果您需要精确定位,请为您的地理位置使用其中一个1层域。那么,应该使用哪个
Indy
组件
tiddayay
TIdDayTimeUDP
,或
TIdSNTP
?除非您必须使用较旧的协议支持某些旧服务器,否则要使用的组件是TIdSNTP我们必须将IdSNTP与主机:pool.ntp.org端口:123配合使用,
TIdSNTP
se.pool.ntp.org
配合使用。代码
DateTimeToStr(IdSNTP1.DateTime)
返回
1942-08-05 01:48:22
@Andreas Rejbrand仅尝试使用“pool.ntp.org”作为主机。ntp.org支持metime.windows.com的ok,AFAIK仅支持ntp。如果您喜欢使用较旧的procols,NIST服务器()仍然支持白天和时间协议。我看到许多其他事情都不正常。我听说Time.windows.com已经关闭down@David当前位置尽管如此,对我仍然有效@Vibeeshan:+1因为我不明白为什么有人否决了你。我曾经尝试过(徒劳地)让这样的事情发生,所以这是一个非常有效的问题。(这也不是说Idsandon的方法对我有效,但这个问题仍然有效。)是的,time.windows.com很好,显然是在胡说八道!当我使用
SNTPClient.SyncTime运行此命令时替换为ShowMessage(DateTimeToStr(SNTPClient.DateTime))我得到了
1942-08-0517:13:16
。这应该行得通。发布一个完整的代码示例,我们可以尝试了解发生了什么。最好使用:Label1.Caption:=datetimetostr(IdSNTP1.DateTime);
Label1.Caption := DateToStr(IdSNTP1.DateTime)
   + ' - ' + TimeToStr(IdSNTP1.DateTime);
Label2.Caption := IdSNTP1.Host;