2009-10-21 29 views
10

Tôi đã viết một ứng dụng dành cho máy tính để bàn và đang sử dụng datetime.datetime.utcnow() để định thời gian, tuy nhiên gần đây tôi đã nhận thấy rằng một số người sử dụng ứng dụng nhận được kết quả cực kỳ khác với tôi khi chúng tôi chạy chương trình cùng một lúc. Có cách nào để có được thời gian UTC tại địa phương mà không sử dụng urllib để lấy nó từ một trang web?Làm cách nào để có được thời gian UTC chính xác với Python?

Trả lời

20

Python phụ thuộc vào hệ điều hành cơ bản để cung cấp đồng hồ thời gian chính xác trong ngày. Nếu nó không làm điều đó, bạn không có nhiều lựa chọn khác hơn là bỏ qua o/s. Có một triển khai thuần-Python của ứng dụng NTP here. Một cách tiếp cận rất đơn giản:

>>> 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) 

Tuy nhiên, sẽ không hay khi liên tục đánh vào các máy chủ NTP khác ngoài kia. Một công dân mạng tốt sẽ sử dụng thư viện máy khách ntp để theo dõi sự bù đắp giữa đồng hồ hệ thống o/s và thu được từ máy chủ và chỉ thăm dò định kỳ để điều chỉnh thời gian.

+0

Và với monkeypatching, bạn có thể ghi lại bù đắp đó và thay đổi phương thức thư viện datetime để áp dụng bù trừ bất cứ khi nào một phần của ứng dụng yêu cầu thời gian. Nó sẽ là tốt đẹp nếu thời gian và thư viện datetime sẽ xử lý loại bù đắp tự động. Bạn có thể nói với nó rằng bạn muốn thời gian thực thế giới, nó sẽ nhấn một máy chủ NTP, ghi lại sự bù đắp, và áp dụng nó mỗi khi thời gian đó được sử dụng. –

+2

Điều này không tính đến "thời gian đi lại" của việc đưa ra yêu cầu. Những gì bạn muốn làm là sử dụng 'time.clock()' để đo thời gian 'NTPClient()' đã trả lời, chia đôi và thêm vào thời gian đã cho. Đó là chính xác. –

7

Thực ra, ntplib tính toán khoản bù trừ này cho việc trì hoãn chuyến khứ hồi. Có sẵn thông qua thuộc tính "bù đắp" của phản hồi NTP. Do đó kết quả không nên rất hoang dại.

+1

Đây là một nhận xét hữu ích nhưng không phải là câu trả lời. Bạn nên di chuyển nó vào các bình luận ở trên. – jfs

+0

Tôi nghĩ rằng nó cung cấp một loại câu trả lời theo cách mà các quan sát của OP (kết quả cực kỳ khác nhau) có thể sai. Và làm thế nào để bất cứ ai muốn có được thời gian UTC tại địa phương mà không có một đồng hồ nguyên tử? – Trilarion

+0

@Trilarion: Tôi không thấy bất cứ điều gì bất thường khi các máy tính khác nhau trả về thời gian khác nhau. Ngay cả [nếu thời gian được đồng bộ bằng ntp; nó có thể khác nhau bởi hàng chục mili giây trên internet] (http://stackoverflow.com/a/97939/4279). Bạn không cần đồng hồ nguyên tử địa phương, để có được thời gian UTC (không được biết đến trong thời gian thực nếu bạn muốn hàng chục nano giây chính xác) với độ chính xác milli- micro giây, bạn có thể sử dụng GPS (ví dụ, thông qua phần mềm ntp tương tự)). Đối với quy mô: [hiệu ứng tương đối tính là micro giây mỗi ngày ở đây] (http://www.astronomy.ohio-state.edu/~pogge/Ast162/Unit5/gps.html) – jfs

Các vấn đề liên quan