2009-10-21 39 views

答えて

20

Pythonは、正確な時刻クロックを提供するために基礎となるオペレーティングシステムに依存しています。それをしていない場合は、o/sをバイパスする以外の方法はありません。純粋なPython実装のNTPクライアントhereがあります。非常にシンプルなアプローチ:

>>> import ntplib,datetime 
>>> x = ntplib.NTPClient() 
>>> datetime.datetime.utcfromtimestamp(x.request('europe.pool.ntp.org').tx_time) 
datetime.datetime(2009, 10, 21, 7, 1, 54, 716657) 

しかし、他のNTPサーバーで継続的にヒットするのはあまり良いことではありません。良い市民は、ntpクライアントライブラリを使用して、o/sシステムクロックとサーバーから取得したものとの間のオフセットを追跡し、時間を調整するために定期的にポーリングするだけです。

+0

モノスケッチでは、そのオフセットを記録し、アプリケーションの一部が時間を要求するたびにオフセットを適用するようにdatetimeライブラリメソッドを変更することができます。 timeとdatetimeのライブラリがこの種のオフセットを自動的に処理するなら、いいでしょう。あなたは実際の世界の時間を望んでいると言うことができます、それはNTPサーバーを打つ、オフセットを記録し、その時間が使用されるたびにそれを適用します。 –

+2

これは、リクエストを行うための「往復時間」を考慮していません。あなたがしたいのは、 'time.clock()'を使って 'NTPClient()'が応答するまでの時間を測定し、それを半分に分割して指定した時間に追加することです。それは正確です。 –

7

実際には、ntplibは、この往復遅延を考慮したオフセットを計算します。 NTP応答の "offset"属性によって利用可能です。したがって結果はあまりにも激しくはありません。

+1

これは役に立つコメントですが、答えではありません。上記のコメントに移動してください。 – jfs

+0

私は、OPの観察(非常に異なる結果)が間違っているかもしれないような形で答えを与えると思います。そして、誰が原子時計を持たずにローカルでUTC時間を取得したいのですか? – Trilarion

+0

@トルリオン:異なるコンピュータが別の時間を返すという珍しいことはありません。たとえ[時間がntpを使って同期されていれば;それはインターネット上の数十ミリ秒で異なるかもしれません](http://stackoverflow.com/a/97939/4279)。ミリ秒、マイクロ秒の精度でUTC時間を取得するにはローカルの原子時計は必要ありません(これは数十ナノ秒の精度が必要な場合はリアルタイムではわかりません)、GPSを使用することができます(例:同じntpソフトウェア)。規模について:[相対論的効果は1日あたりマイクロ秒である](http://www.astronomy.ohio-state.edu/~pogge/Ast162/Unit5/gps.html) – jfs

関連する問題