2012-09-30 30 views
11

私はPythonで時間サーバを照会して時刻を表示してプログラムを実行するが、結果は得られません。Pythonでntpクライアント

# File: Ntpclient.py 
from socket import AF_INET, SOCK_DGRAM 
import sys 
import socket 
import struct, time 

# # Set the socket parameters 

host = "pool.ntp.org" 
port = 123 
buf = 1024 
address = (host,port) 
msg = 'time' 


# reference time (in seconds since 1900-01-01 00:00:00) 
TIME1970 = 2208988800L # 1970-01-01 00:00:00 

# connect to server 
client = socket.socket(AF_INET, SOCK_DGRAM) 
client.sendto(msg, address) 
msg, address = client.recvfrom(buf) 

t = struct.unpack("!12I", data)[10] 
t -= TIME1970 
print "\tTime=%s" % time.ctime(t) 
+4

なぜntplibを使用しませんか? http://pypi.python.org/pypi/ntplib/ –

答えて

4

それは

msg = '\x1b' + 47 * '\0' 

代わりの

msg = 'time' 
次のようになります。 私は、Pythonの2.7.3統合開発環境を使用していて、私のOSは、Windows 7 ここではコードです

しかし、Maksymが言ったように、代わりにntplibを使うべきです。

1

申し訳ありませんが私の答えがあなたの期待を満たしていない場合。既存のソリューションを使用することが理にかなっていると思います。 ntplibは、NTPサーバーを扱うための非常に良いライブラリです。

17

使用ntplib

次は、Python 2と3の両方で動作するはずです:

import ntplib 
from time import ctime 
c = ntplib.NTPClient() 
response = c.request('pool.ntp.org') 
print(ctime(response.tx_time)) 

出力:

Fri Jul 28 01:30:53 2017 
+0

多くの人に感謝します。私はライブラリファイルを含んでいます:時間のインポートctimeからそれは正常に働いた –

1
msg = '\x1b' + 47 * '\0' 
....... 
t = struct.unpack("!12I", msg)[10] 
+0

これは質問に答えるかもしれませんが(私はわかりません)、それは通常良いですなぜ(そしてどのように)これが問題を解決するかについての何らかの説明を含めること。これは特に、1年以上前に尋ねられた質問に答えるときに適用され、すでに[同様の回答]があります(http://stackoverflow.com/a/12664634/466862) –

9

ここでは、上記の溶液のための修正です実装に秒数分を加え、ソケットを適切に閉じます。実際にはほんの一握りのコードであるため、プロジェクトに別の依存関係を追加することは望ましくありませんでしたが、ntplibはたいていの場合、おそらく行く方法でしょう。

#!/usr/bin/env python 
from contextlib import closing 
from socket import socket, AF_INET, SOCK_DGRAM 
import sys 
import struct 
import time 

NTP_PACKET_FORMAT = "!12I" 
NTP_DELTA = 2208988800L # 1970-01-01 00:00:00 
NTP_QUERY = '\x1b' + 47 * '\0' 

def ntp_time(host="pool.ntp.org", port=123): 
     with closing(socket(AF_INET, SOCK_DGRAM)) as s: 
      s.sendto(NTP_QUERY, (host, port)) 
      msg, address = s.recvfrom(1024) 
     unpacked = struct.unpack(NTP_PACKET_FORMAT, 
         msg[0:struct.calcsize(NTP_PACKET_FORMAT)]) 
     return unpacked[10] + float(unpacked[11])/2**32 - NTP_DELTA 


if __name__ == "__main__": 
    print time.ctime(ntp_time()).replace(" "," ") 
+0

古いスレッドですが、これは良い、迅速な解決策です私のビルドシステム(Petalinux)にモジュールを追加する方法を理解しようとするのではなく、 –

関連する問題