Nhận thời gian hiện tại tính bằng mili giây trong Python?


532

Làm cách nào tôi có thể có được thời gian hiện tại tính bằng mili giây trong Python?


67
import time; ms = time.time()*1000.0
samplebias

4
@samplebias: time.time()có thể cung cấp độ chính xác kém hơn datetime.utcnow()trên một số nền tảng và phiên bản python.
jfs

5
Trong một phần nghìn giây kể từ khi nào? Nếu bạn có nghĩa là kể từ kỷ nguyên (nửa đêm ngày 1 tháng 1 năm 1970 UTC), hãy xem điều này: stackoverflow.com/questions/18169099/ợi
Michael Scheper

2
Để biết tem thời gian tính bằng mili giây có độ phân giải micrô giây chính xác, hãy xem tại đây: stackoverflow.com/questions/38319606/ Đổi
Gabriel Staples

Câu trả lời:


710

Đối với những gì tôi cần, đây là những gì tôi đã làm, dựa trên nhận xét của @samplebias ở trên:

import time
millis = int(round(time.time() * 1000))
print millis

Nhanh chóng. Cảm ơn tất cả, xin lỗi cho rắm não.

Để sử dụng lại:

import time

current_milli_time = lambda: int(round(time.time() * 1000))

Sau đó:

>>> current_milli_time()
1378761833768

34
Điều này có thể không đưa ra câu trả lời chính xác. Theo các tài liệu, "Lưu ý rằng mặc dù thời gian luôn được trả về dưới dạng số dấu phẩy động, nhưng không phải tất cả các hệ thống đều cung cấp thời gian với độ chính xác tốt hơn 1 giây"
Jason Polites

11
Tôi đang tự hỏi, tại sao bạn cần phải round? Có vẻ như int(time.time() * 1000)là đủ?
Maxim Vladimirsky

14
IMO Tôi sẽ sử dụng sàn và không tròn, nhưng đó chỉ là tôi. Nếu ai đó hỏi giờ là mấy giờ và là 7:32, con số họ có thể muốn là 7 chứ không phải 8.
davr

1
@ParallelUniverse: .utcnow()sử dụng GetSystemTimeAsFileTime()trên CPython gần đây trên Windows . Sẽ không time.clock()gọi ( QueryPerformanceCounter()) giới thiệu nhiều tiếng ồn hơn nó có thể giảm? Xem độ chính xác không giống như độ chính xác .
jfs

10
@MaximVladimirsky Đó không phải là hành vi của int (). Int không sàn một giá trị, nó làm tròn về không. Đó là điều tương tự cho số dương, nhưng ngược lại cho số âm. int (1.5) cho 1, int (-1.5) mang đến -1, Math.floor (-1.5) mang đến -2 Xem: docs.python.org/2/library/stdtypes.html
Skip Huffman

91

time.time()chỉ có thể đưa ra giải pháp cho lần thứ hai, cách tiếp cận ưa thích trong một phần nghìn giây là datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond

94
không hoàn toàn hữu ích - điều này chỉ cung cấp cho bạn các phần triệu giây trong giây của dt. xem stackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1 vì đây là cách chính thức để có dấu thời gian đáng tin cậy từ hệ thống.
Pascal

16
-1. đây là một câu trả lời không chính xác cho câu hỏi này như @Boris đã nhận xét, điều này không cung cấp "thời gian tính bằng micrô giây", ví dụ: không bao gồm ngày, giờ, giây tính theo số micrô giây.
ja

3
+1 Điều này mang lại một giá trị chính xác và số học có thể được coi là hoạt động vì toán học. Nếu người dùng cần thời gian hiện tại tính bằng mili giây / micro giây, số học đơn giản sẽ đưa họ đến đó. Nếu một đồng bằng thời gian là cần thiết - không được yêu cầu - số học, một lần nữa, sẽ tiết kiệm trong ngày.
Jack Stout

3
Cung cấp micro giây của thời gian hiện tại, không phải toàn bộ dấu thời gian.
kawadhiya21

48
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

3
bạn có thể nội tuyến công thức .total_seconds()để tạo ra độ chính xác tốt hơn (có thể): (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(với tính năng phân chia thực sự được bật) Hoặc nếu bạn muốn cắt bớt mili giây thì hãy sử dụng // 10**3.
jfs

1
Đây có vẻ là câu trả lời tốt nhất nếu sử dụng datetime
dlsso

35

Từ phiên bản 3.7, bạn có thể sử dụng time.time_ns()để có được thời gian trôi qua nano giây từ epoch. Vì vậy bạn có thể làm

ms = time.time_ns() // 1000000 

để lấy thời gian tính bằng mili-giây dưới dạng số nguyên.


Điều này làm việc tốt nhất với tôi (Python 3.7.6)
Paul Watson

22

Chỉ cần mã mẫu:

import time
timestamp = int(time.time()*1000.0)

Đầu ra: 1534343781311


13

một giải pháp khác là chức năng bạn có thể nhúng vào utils.py của riêng bạn

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))

12

Nếu bạn muốn một phương thức đơn giản trong mã của bạn trả về mili giây với datetime:

from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed milliseconds since the start of the program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms

đây là sự khác biệt giữa hai lần tính bằng mili giây, kết hợp phương pháp của bạn với câu trả lời của @Jason sẽ đưa ra dấu thời gian hiện tại tính bằng mili giây ... Nghĩ về nó, dấu thời gian UNIX sẽ là phương thức của bạn với start_time= datetime (1970,1,1)
PR

giờ địa phương có thể mơ hồ và không đơn điệu (do chuyển đổi DST hoặc lý do khác để thay đổi bù utc cục bộ). Sử dụng .utcnow()thay thế hoặc nếu bạn không cần thời gian tuyệt đối thì bạn có thể sử dụng time.monotonous(). Lưu ý: có một sự khác biệt tinh tế do các số liệu điểm nổi giữa some_int + dt.microseconds/ 1000.0và công thức ( ) / 10**3với phân chia thực sự được kích hoạt. Xem công thức rõ ràng và liên kết total_seconds()trong câu trả lời liên quan
jfs

7

Cách đơn giản nhất mà tôi đã tìm thấy để có được thời gian UTC hiện tại tính bằng mili giây là:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Nếu bạn lo lắng về việc đo thời gian đã trôi qua, bạn nên sử dụng đồng hồ đơn điệu (python 3) . Đồng hồ này không bị ảnh hưởng bởi các cập nhật đồng hồ hệ thống như bạn sẽ thấy nếu một truy vấn NTP điều chỉnh thời gian hệ thống của bạn, chẳng hạn.

>>> import time
>>> millis = round(time.monotonic() * 1000)

Nó cung cấp thời gian tham chiếu tính bằng giây có thể được sử dụng để so sánh sau này để đo thời gian đã trôi qua.


4

Nếu bạn sử dụng mã của tôi (bên dưới), thời gian sẽ xuất hiện sau vài giây, sau đó, sau một thập phân, mili giây. Tôi nghĩ rằng có một sự khác biệt giữa Windows và Unix - vui lòng bình luận nếu có.

from time import time

x = time()
print(x)

kết quả của tôi (trên Windows) là:

1576095264.2682993

EDIT : Không có sự khác biệt :) Cảm ơn tc0nn


1
Không có khác biệt trên Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Không có khác biệt trên Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Các phép nhân này đến 1000 trong một phần nghìn giây có thể là tốt để giải quyết hoặc làm cho một số điều kiện tiên quyết được chấp nhận. Nó có thể được sử dụng để lấp đầy một khoảng trống trong cơ sở dữ liệu của bạn mà không thực sự sử dụng nó. Mặc dù, đối với các tình huống thực tế đòi hỏi thời gian chính xác, cuối cùng nó sẽ thất bại. Tôi sẽ không đề nghị bất cứ ai sử dụng phương pháp này cho các hoạt động quan trọng đòi hỏi phải có hành động hoặc xử lý theo thời gian cụ thể.

Ví dụ: ping chuyến đi khứ hồi là 30-80ms ở Hoa Kỳ ... Bạn không thể làm tròn số đó và sử dụng nó một cách hiệu quả.

Ví dụ của riêng tôi yêu cầu các tác vụ ở mỗi giây, điều đó có nghĩa là nếu tôi làm tròn sau khi các tác vụ đầu tiên được trả lời, tôi vẫn sẽ phải chịu thời gian xử lý nhân với mỗi chu kỳ vòng lặp chính. Điều này kết thúc là một cuộc gọi chức năng tổng số cứ sau 60 giây. đó là ~ 1440 một ngày .. không quá chính xác.

Chỉ là một suy nghĩ cho những người tìm kiếm lý luận chính xác hơn ngoài việc giải quyết một khoảng cách cơ sở dữ liệu không bao giờ thực sự sử dụng nó.


2
Bạn có một giải pháp tốt hơn? Thành thật mà nói, tôi không hiểu bạn đang nói gì cả. Bạn có ý nghĩa gì khi "làm tròn"?
Đêm vô thường

2
Giải thích giải pháp của bạn với một ví dụ thực tế để hiểu rõ hơn
Ratan Uday Kumar

0

Chỉ là một giải pháp khác sử dụng datetimemô-đun cho Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.