Delphi 一个获取网络服务器时间错误的问题,望高人帮帮

loveddwd 2010-08-01 05:25:06

procedure TForm1.Button2Click(Sender: TObject);
var
XmlHttp: Variant;
datetxt: string;
DateLst: TStringList;
mon: string;
timeGMT, GetNetTime: TDateTime;
begin
XmlHttp := CreateOleObject('Microsoft.XMLHTTP');
XmlHttp.Open('Get', 'http://www.baidu.com/', False);
XmlHttp.send;
datetxt := XmlHttp.getResponseHeader('Date');
datetxt := Copy(datetxt, Pos(',', datetxt) + 1, 100);
datetxt := StringReplace(datetxt, 'GMT', '', []);
datetxt := Trim(datetxt);
DateLst := TStringList.Create;
while Pos(' ', datetxt) > 0 do
begin
DateLst.Add(Copy(datetxt, 1, Pos(' ', datetxt) - 1));
datetxt := Copy(datetxt, Pos(' ', datetxt) + 1, 100);
end;
DateLst.Add(datetxt);
if DateLst[1] = 'Jan' then
mon := '01'
else if DateLst[1] = 'Feb' then
mon := '02'
else if DateLst[1] = 'Mar' then
mon := '03'
else if DateLst[1] = 'Apr' then
mon := '04'
else if DateLst[1] = 'Mar' then
mon := '05'
else if DateLst[1] = 'Jun' then
mon := '06'
else if DateLst[1] = 'Jul' then
mon := '07'
else if DateLst[1] = 'Aug' then
mon := '08'
else if DateLst[1] = 'Sep' then
mon := '09'
else if DateLst[1] = 'Oct' then
mon := '10'
else if DateLst[1] = 'Nov' then
mon := '11'
else if DateLst[1] = 'Dec' then
mon := '12';
timeGMT := StrToDateTime(DateLst[2] + '-' + mon + '-' + DateLst[0] + ' ' + DateLst[3]);
GetNetTime := IncHour(TimeGMT, 8);
Label1.Caption := FormatDateTime('yyyy年mm月dd日 HH:NN:SS', GetNetTime);
end;




各位帮帮,我这么写编译运行时总是提示错误提示 “List index out of bounds (1)” 不知道是哪里错了啊。请各位大虾帮帮。感谢不尽~

...全文
449 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sohh888 2011-07-21
  • 打赏
  • 举报
回复
我测试有时候成功有时出这个错,我怀疑是有时候没成功取到服务器时间
npkaida 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loveddwd 的回复:]
抱歉,换成什么都会出现“List index out of bounds (1)” 不是URL的问题。也不是服务器的问题。
[/Quote]
代码没错,到服务器取时间不是每次都会成功的。你用 Windows 系统自身的 Internet 时间同步试试,
也经常会失败。按我说的增加一行失败时的提示即可。
代码我是经过测试的,没问题。
kye_jufei 2010-08-04
  • 打赏
  • 举报
回复
越界錯誤,設置一個斷點看一下:DateLst的值是多少???TStringList的用法...

 DateLst.DelimitedText := datetxt;
DateLst.Delimiter := ' ';


likeyrain 2010-08-04
  • 打赏
  • 举报
回复
先搞清楚DateLst.count是多少吧
loveddwd 2010-08-03
  • 打赏
  • 举报
回复
我想直接取一些公共URL的服务器时间,只需要服务器返回一个时间日期值既可了。
老之 2010-08-02
  • 打赏
  • 举报
回复
我怀疑是你的网络原因,datetxt取了空值,导致后面报错。

把while Pos(' ', datetxt) > 0 do
begin
DateLst.Add(Copy(datetxt, 1, Pos(' ', datetxt) - 1));
datetxt := Copy(datetxt, Pos(' ', datetxt) + 1, 100);
end;
DateLst.Add(datetxt);
改成:
DateLst.DelimitedText := datetxt;
DateLst.Delimiter := ' ';
再跟踪一下DateLst的内容
loveddwd 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 npkaida 的回复:]

尝试将 'http://www.baidu.com/' 换成:
'http://www.163.com/'

'http://cn.yahoo.com/'
试试。
代码我测试通过。

抱歉,换成什么都会出现“List index out of bounds (1)” 不是URL的问题。也不是服务器的问题。

你换成其他的可以多试几次也同样报错。
亮剑_ 2010-08-02
  • 打赏
  • 举报
回复
远程服务器上开一个WebService,返回时间
如果是数据库服务器且数据库服务端口允许开放,也可以直接取数据库时间
loveddwd 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liangqingzhi 的回复:]
我怀疑是你的网络原因,datetxt取了空值,导致后面报错。

把while Pos(' ', datetxt) > 0 do
begin
DateLst.Add(Copy(datetxt, 1, Pos(' ', datetxt) - 1));
datetxt := Copy(datetxt, Pos(' ', datetxt) + 1, 100);
end;
……
[/Quote]


大哥你有更好的获取一个远程服务器时间的DEMO没啊?
npkaida 2010-08-01
  • 打赏
  • 举报
回复

Delphi(Pascal) code
procedure TForm1.Button2Click(Sender: TObject);
var
XmlHttp: Variant;
datetxt: string;
DateLst: TStringList;
mon: string;
timeGMT, GetNetTime: TDateTime;
begin
//......
DateLst.Add(datetxt);
if DateLst.Count<2 then
Label1.Caption := '获取时间失败!'
else
begin
if DateLst[1] = 'Jan' then
mon := '01'
//......
GetNetTime := IncHour(TimeGMT, 8);
Label1.Caption := FormatDateTime('yyyy年mm月dd日 HH:NN:SS', GetNetTime);
end;
end;

尝试将 'http://www.baidu.com/' 换成:
'http://www.163.com/'

'http://cn.yahoo.com/'
试试。
代码我测试通过。
dd_zhouqian 2010-08-01
  • 打赏
  • 举报
回复
多半是这句报错,你调试看下DateLst.count,然后检查下面的是否有效
timeGMT := StrToDateTime(DateLst[2] + '-' + mon + '-' + DateLst[0] + ' ' + DateLst[3]);
罗捷捷 2010-08-01
  • 打赏
  • 举报
回复
没看清楚 对不起. 你检查一下 DateLst在报错时Count是多少.应该是它越界了
罗捷捷 2010-08-01
  • 打赏
  • 举报
回复
delphi数组是从0开始不是1

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧