2010-03-06 38 views
30

Tôi đã cố gắng để tìm một cách để có được thời gian từ 1970-01-01 00:00:00 UTC trong vài giây và nano giây trong python và tôi không thể tìm thấy bất cứ điều gì mà sẽ cho tôi độ chính xác phù hợp.Nhận thời gian POSIX/Unix tính bằng giây và nano giây bằng Python?

Tôi đã cố gắng sử dụng mô-đun thời gian, nhưng chính xác đó là chỉ để micro, vì vậy mã tôi đã cố gắng là:

import time 

print time.time() 

đó đã cho tôi một kết quả như thế này:

1267918039.01 

Tuy nhiên, Tôi cần kết quả như sau:

1267918039.331291406 

Có ai biết cách có thể diễn tả thời gian UNIX không e tính bằng giây và nano giây? Tôi không thể tìm cách để đặt độ chính xác phù hợp hoặc nhận kết quả theo định dạng đúng. Cảm ơn bạn đã giúp đỡ

+0

@GregS: kiên trì đi kèm với tuổi :) – tzot

Trả lời

5

Rất có thể bạn sẽ thực sự nhận được độ chính xác nano giây từ bất kỳ máy hiện tại nào.

Máy không thể tạo độ chính xác và hiển thị các chữ số có ý nghĩa khi không phù hợp không phải là điều phải làm.

2

Tôi không nghĩ rằng có một cách độc lập nền tảng (có thể một số bên thứ ba đã mã hóa một, nhưng tôi không thể tìm thấy nó) để có được thời gian trong nano giây; bạn cần thực hiện nó theo cách cụ thể theo nền tảng. Ví dụ: câu trả lời của this SO question cho biết cách thực hiện trên nền tảng cung cấp thư viện hệ thống librt.so cho các hoạt động "thời gian thực".

31

chính xác của bạn chỉ là bị mất do định dạng chuỗi:

>>> import time 
>>> print "%.20f" % time.time() 
1267919090.35663390159606933594 
+4

Thực ra tôi có thể tưởng tượng rằng nó là chính xác đến rất nhiều chữ số thập phân, nhưng có độ chính xác ! :) – MattH

+2

bạn có nghĩa là * không * chính xác đến rất nhiều chữ số thập phân. ['time.time()' trên CPython gần đây sử dụng 'clock_gettime (2)', 'GetSystemTimeAsFileTime()' depening on OS (bạn có thể gọi chúng trên các phiên bản Python cũ hơn) (http://stackoverflow.com/a/ 28574340/4279)) - mặc dù có lẽ thời gian hệ thống không đủ chính xác ngay cả đối với các giao diện dựa trên micro giây cũ. – jfs

+1

Không thể lấy độ chính xác nano giây từ 1970-04-15 từ time.time không có định dạng nào bạn đang sử dụng, vì float trả về time.time và nó chỉ có độ chính xác 53 bit và độ chính xác chỉ có thể đại diện khoảng 104 ngày với độ chính xác nano giây (9007199254740992 nano giây). – czz

8

Vấn đề có lẽ là liên quan đến hệ điều hành của bạn, không Python. Xem tài liệu của module time: http://docs.python.org/library/time.html

time.time()

Return thời gian như là một điểm số nổi bày tỏ trong vài giây kể từ khi thời đại, trong UTC. Lưu ý rằng ngay cả khi thời gian luôn được trả lại là số dấu phẩy động, không phải tất cả các hệ thống đều cung cấp thời gian tốt hơn chính xác hơn 1 giây. Trong khi chức năng này thường trả về giá trị không giảm, nó có thể trả về giá trị thấp hơn so với cuộc gọi trước đó nếu đồng hồ hệ thống đã được đặt lại giữa hai cuộc gọi.

Nói cách khác: nếu hệ điều hành của bạn không thể làm điều đó, Python không thể làm điều đó. Bạn có thể nhân giá trị trả về theo thứ tự độ lớn thích hợp để có được giá trị nano giây, mặc dù, không chính xác như nó có thể.

CHỈNH SỬA: Trả lại là một biến phao, do đó số chữ số sau dấu phẩy sẽ thay đổi, cho dù hệ điều hành của bạn có mức độ chính xác hay không. Bạn có thể định dạng nó với "%.nf" trong đó n là số chữ số bạn muốn, tuy nhiên, nếu bạn muốn biểu diễn chuỗi điểm cố định.

+1

Tôi nghĩ rằng vấn đề có thể không phải với hệ điều hành hay python ... vấn đề là phải có cách để nhận siêu dữ liệu trên đó là độ chính xác cao nhất về thời gian được hỗ trợ và cách để có thời gian trong đó không biết nó. :) – n611x007

3

Tùy thuộc vào loại đồng hồ và hệ điều hành và phần cứng của bạn hay không, bạn thậm chí có thể nhận được độ chính xác nano giây ở tất cả. Từ số time module documentation:

Độ chính xác của các hàm thời gian thực khác nhau có thể ít hơn đề xuất của giá trị hoặc đối số của chúng. Ví dụ. trên hầu hết các hệ thống Unix, đồng hồ "đánh dấu" chỉ 50 hoặc 100 lần mỗi giây.

Trên Python 3, mô-đun time cho phép bạn truy cập vào 5 loại đồng hồ khác nhau, mỗi loại có các thuộc tính khác nhau; một số trong số này có thể cung cấp cho bạn thời gian chính xác nano giây. . Sử dụng các time.get_clock_info() function để xem những tính năng mỗi đồng hồ cung cấp và thời gian chính xác được báo cáo trong

Trên OS X 10.11 máy tính xách tay của tôi, các tính năng có sẵn là:

>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'): 
...  print(name, time.get_clock_info(name), sep=': ') 
... 
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06) 
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09) 
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09) 
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06) 
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06) 

nên sử dụng time.monotonic() hoặc time.perf_counter() chức năng sẽ về mặt lý thuyết cho tôi độ phân giải nano giây. Cả hai đồng hồ đều không cho tôi thời gian tường, chỉ thời gian trôi qua; các giá trị khác tùy ý. Tuy nhiên, chúng hữu ích khi đo lường khoảng thời gian điều gì đó đã thực hiện.

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