由于在 CERNET 内,我经常需要用代理上网,没办法直连到 NTP 服务器,因此不能使用 Windows 时间服务对时。偶尔维修电脑或者不小心调整错时间,再加上电脑时钟本身就有一定的漂移,对时就变成了件麻烦的事情。
手动调时也没个参照,误差往往比较大。IPv6 网络上存在一些 NTP 服务器,Linux 下有 ntpdate 是支持 IPv6 NTP 服务器的,但是我搜索了半天,才在一篇文章上看到有人评论说 Windows 下只有一款 NTP 客户端支持 IPv6,还是收费软件——可他也没给出名字。
无奈之下想到 Python 的 httplib 是支持 IPv6 连接的,于是我就仿照 htpdate 写了一个利用 Google 的 IPv6 Web 服务器进行对时的 Python 小工具 htpdate.py。虽然误差比 NTP 大不少,但是还是在可接受范围内(不到 1 秒),而且比较方便,连日期也一块更新了。下面是代码,比较粗糙。
#!/usr/bin/env python
import httplib, time
from os import systemdef main():
conn = httplib.HTTPConnection('google.com')
time.clock()
conn.request('HEAD', '')
t_rtt = time.clock()
res_time = conn.getresponse().getheader('date')
t = time.localtime(time.mktime(time.strptime(res_time,
'%a, %d %b %Y %H:%M:%S %Z')) - time.timezone)
time_str = time.strftime('%H:%M:%S', t)
local_time = time.asctime()
t_exe = time.clock()
centi_sec = (t_exe - t_rtt/2)*100
if centi_sec > 99:
centi_sec = 99
system('time %s.%2.0f' % (time_str, centi_sec))
date_str = time.strftime('%Y-%m-%d', t)
system('date %s' % date_str)
print 'LOCAL TIME: ' + local_time
print 'SERVER TIME: ' + time.asctime(t)
print 'LOCAL TIME: ' + time.asctime()
if (t_exe - t_rtt/2) >= 1:
print 'Round trip time is too long. Time error might be larger than 1 sec.'if __name__ == '__main__':
main()
看看这个? http://pypi.python.org/pypi/ntplib/0.1.8
@xiaket
这个也是不支持 IPv6 的。
@xiaket
谢谢您的评论,我修改了一下您提到的 ntplib,现在可以支持 IPv6 的 NTP 服务器了。见:http://blog.solrex.org/articles/an-ipv6-enabled-ntp-client-for-windows-in-python.html