やりたいこと
ntp
プロトコルで時刻を取得のみしたい(同期は不要)
ntpdate
コマンドで、ntpdate -q
で時刻同期はせずに取得できるものの、
日付 月 時刻 で年が表示されなかったことと、時刻以外の情報も表示されていて、bashで解析するのは少し難しい...
ntp
のプロトコルがあるってことは、クライアントのサンプルとかあるんじゃ?と思って調べてみたら、大好きなpythonでntplib
という
モジュールの中にntplib.NTPClient
とどんぴしゃであった!
試した環境
- Ubuntu 14.04
- Python 3.6.2
ntplibのインストール
pip使ってインストール!
$ (sudo) pip install ntplib
ソースについて
ntplib.NTPCLIENT
で、インスタンス生成
そして、request(ntpservername)
でntpサーバへ問い合わせ
ctime(res.tx_time)にて、いったんctime形式でパースしたものを
datetime型に変換
これで日付型で扱えるので、あとは煮るなり焼くなりするだけ
今回は自分が求めるフォーマットでprintしてます。
gitにも同じコード挙げてます
最初の投稿時ではclass化もしておらず、エラー処理もなかったのですが、
class化 + エラー処理を付け加えました。
また出力フォーマットも引数で柔軟に対応できるようにしてます。
https://github.com/komorin0521/python_sandbox/tree/master/python3
ソース(v.1.1.0): 2017年10月14日更新
# !/usr/bin/env python3
import datetime
from time import ctime
import sys
# please install module using pip-
# (sudo) pip install ntp lib
import ntplib
__author__ = "oomori"
__version__ = "1.2.0"
class MyNTPClient(object):
def __init__(self, ntp_server_host):
self.ntp_client = ntplib.NTPClient()
self.ntp_server_host = ntp_server_host
def get_nowtime(self, timeformat = '%Y/%m/%d %H:%M:%S'):
try:
res = self.ntp_client.request(self.ntp_server_host)
nowtime = datetime.datetime.strptime(ctime(res.tx_time), "%a %b %d %H:%M:%S %Y")
return nowtime.strftime(timeformat)
except Exception as e:
print("An error occured")
print("The information of error is as following")
print(type(e))
print(e.args)
print(e)
sys.exit(1)
def main():
ntp_client = MyNTPClient('ntp.nict.jp')
print(ntp_client.get_nowtime())
if __name__ == "__main__":
main()
参考
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwiPqOXx5-3WAhUIoJQKHVfBDWAQFgg2MAI&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F12664295%2Fntp-client-in-python&usg=AOvVaw2KL0LzfRzflf2OcLcCPWPW
- https://stackoverflow.com/questions/10256093/how-to-convert-ctime-to-datetime-in-python