souripresident
@souripresident

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python

Q&A

Closed

解決したいこと

書いたプログラム

import requests
import ntplib
from datetime import datetime, timedelta
import sys


class MyNTPClient:
    def __init__(self, ntp_server_host='ntp.nict.jp'):
        self.ntp_client = ntplib.NTPClient()
        self.ntp_server_host = ntp_server_host

    def get_nowtime(self, timeformat='%Y-%m-%d %H:%M:%S'):
        try:
            response = self.ntp_client.request(self.ntp_server_host, version=2)
            nowtime = datetime.utcfromtimestamp(response.tx_time) + timedelta(hours=9)
            return nowtime
        except Exception as e:
            sys.exit(f"Error: {e}")

ntp_client = MyNTPClient()
ntp_time = ntp_client.get_nowtime()
local_time = datetime.now()
time_diff = (local_time - ntp_time).total_seconds()
print(f"NTPサーバー時刻 (JST): {ntp_time}")
print(f"ローカルシステム時刻: {local_time}")
print(time_diff) 

出力されたもの

NTPサーバー時刻 (JST): 2024-06-08 18:56:54.663496
ローカルシステム時刻: 2024-06-08 18:56:54.774564
0.111068
2024-06-08 18:56:54.774564

参考にさせて頂いた記事

0

1Answer

何をしたいのかよく分かりませんが、NTPを利用してシステムクロックとの差異を算出し、NTP時間で既定時間(start_time)までsleepしたいということなのでしょうか?

であれば、何となく出来てると思うので、問題となるパターンを他の人が再現できるように正確に伝えましょう。またそのパターンをどう制御したいがどうなって困っているかを伝えましょう。

例えば私が見る限り既定時間が過去の時間になるケースで、sleepの引数が負値になり正しく動作しないというのは確認しました。この場合どうしたいかも含めて、正確に記述してください、ということです。

0Like

Comments

  1. @souripresident

    Questioner

    そちらの認識で正しいです!
    特に出力された内容に関してです。誤差が0.11….と計測され、その値をsleep時間に足して待機させているのにも関わらず、sleep後にprintされた時間がsleep前と同じなのです…….とつらつら書いている間に、local_time=と定義した段階で時間が固定されていることに気がつきました。
    お騒がせしました。

    ついでと言ってはなんですが
    response = self.ntp_client.request(self.ntp_server_host, version=2)こちらの文のversion=2と
    except Exception as e:
    sys.exit(f"Error: {e}")
    こちらの文の意味を教えて頂けますでしょうか

  2. では質問時点で気になっていた問題は自力で解決できたということですね。

    ついでの質問については、クラスを理解していれば、self.ntp_clientntplib.NTPClientということが分かりますよね。ntplibをpipなどでインストールしているはずなので、pypiのページが分かります。

    そこのプロジェクトのリンクを辿ればNTPClientのコードが見れるので、そのrequestメソッドを見ると…

    と載っています。つまりNTPというプロトコルのバージョン2を使うということです。wikipediaによると

    RFC1119ということです。以下の仕様に基づいて問い合わせをするという指定になります。

    exceptionについては言語仕様を確認してください。

  3. @souripresident

    Questioner

    追加の質問にも快く答えて下さり有難うございます!

Your answer might help someone💌