Uzyskaj aktualny czas w milisekundach w Pythonie?


531

Jak mogę uzyskać bieżący czas w milisekundach w Pythonie?


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

4
@samplebias: time.time()może zapewniać gorszą precyzję niż datetime.utcnow()na niektórych platformach i wersjach Pythona.
jfs

5
W milisekundach od kiedy ? Jeśli masz na myśli od epoki (północ 1 stycznia 1970 roku UTC), zobacz to: stackoverflow.com/questions/18169099/...
Michael Scheper

2
Prawdziwe znaczniki czasu w mikrosekundach w rozdzielczości milisekund znajdują się tutaj: stackoverflow.com/questions/38319606/...
Gabriel Staples,

Odpowiedzi:


710

Oto, co potrzebowałem, oto co zrobiłem na podstawie powyższego komentarza @samplebias:

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

Szybko i łatwo. Dzięki wszystkim, przepraszam za pierdnięcie mózgu.

Do ponownego użycia:

import time

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

Następnie:

>>> current_milli_time()
1378761833768

34
To może nie dać poprawnej odpowiedzi. Zgodnie z dokumentami „zauważ, że chociaż czas jest zawsze zwracany jako liczba zmiennoprzecinkowa, nie wszystkie systemy zapewniają czas z lepszą precyzją niż 1 sekunda”
Jason Polites

11
Zastanawiam się, dlaczego potrzebujesz round? Wydaje się, że int(time.time() * 1000)wystarczy?
Maxim Vladimirsky

14
IMO użyłbym podłogi, a nie okrągłej, ale to tylko ja. Jeśli ktoś zapyta, która jest godzina, a jest 7:32, prawdopodobnie liczba, której chce, to 7, a nie 8.
davr

1
@ParallelUniverse: .utcnow()używa GetSystemTimeAsFileTime()ostatnio CPython w systemie Windows . Czy time.clock()wywołanie ( QueryPerformanceCounter()) nie wprowadziłoby więcej szumów niż mogłoby to zredukować? Zobacz Precyzja to nie to samo co dokładność .
jfs

10
@MaximVladimirsky To nie jest zachowanie int (). Int nie podaje wartości minimalnej, zaokrągla w kierunku zera. To samo dla liczby dodatniej, ale przeciwnie dla liczby ujemnej. int (1.5) daje 1, int (-1,5) daje -1, matematyka. podłoga (-1,5) daje -2 Patrz: docs.python.org/2/library/stdtypes.html
Pomiń Huffman

91

time.time()może dać rozdzielczość tylko drugiemu, preferowanym podejściem dla milisekund jest datetime.

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

94
nie całkiem użyteczne - daje to tylko mikrosekundy w ciągu sekundy dt. patrz stackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1, ponieważ jest to oficjalny sposób na uzyskanie wiarygodnego znacznika czasu z systemu.
Pascal

16
-1. to jest nieprawidłowa odpowiedź na to pytanie. jak skomentował @ Boris, nie daje to „czasu w mikrosekundach”, np. nie obejmuje dni, godzin i sekund w liczbie mikrosekund.
ja

3
+1 To daje prawidłową wartość i można założyć, że arytmetyka działa, ponieważ matematyka. Jeśli użytkownik potrzebuje aktualnego czasu w milisekundach / mikrosekundach, prosta arytmetyka go tam osiągnie. Jeśli potrzebna jest delta czasu - o którą nie jest proszony - arytmetyka, znowu oszczędza dzień.
Jack Stout

3
Podaje mikrosekundę bieżącego czasu, a nie cały znacznik czasu.
kawadhiya21


35

Od wersji 3.7 możesz użyć, time.time_ns()aby uzyskać upływ czasu w ciągu nano sekund od epoki. Więc możesz to zrobić

ms = time.time_ns() // 1000000 

uzyskać czas w mili-sekundach jako liczbę całkowitą.


To zadziałało najlepiej dla mnie (Python 3.7.6)
Paul Watson

22

Po prostu przykładowy kod:

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

Wyjście: 1534343781311


13

innym rozwiązaniem jest funkcja, którą można osadzić we własnym pliku utils.py

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

12

Jeśli potrzebujesz prostej metody w kodzie, która zwraca milisekundy z 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

to jest różnica między dwa razy w milisekundach, połączenie metody z odpowiedzią @Jason daje aktualny znacznik czasu w milisekundach. Pomyśląc o tym, znacznik czasu UNIX byłby twoją metodą z start_time= datetime (1970,1,1)
PR

czas lokalny może być niejednoznaczny i niemonotoniczny (ze względu na przejścia DST lub inne powody zmiany lokalnego przesunięcia utc). Użyj .utcnow()zamiast tego lub jeśli nie potrzebujesz czasu bezwzględnego, możesz użyć time.monotonous(). Uwaga: istnieje subtelna różnica wynikająca z arytmetyki zmiennoprzecinkowej między some_int + dt.microseconds/ 1000.0formułą ( ) / 10**3i włączonym prawdziwym dzieleniem. Zobacz wyraźną formułę i link total_seconds()w pokrewnej odpowiedzi
jfs

7

Najprostszym sposobem na uzyskanie bieżącego czasu UTC w milisekundach jest:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Jeśli obawiasz się o pomiar upływającego czasu, powinieneś użyć zegara monotonicznego (python 3) . Aktualizacje zegara systemowego nie mają wpływu na ten zegar, tak jakbyś na przykład sprawdził, czy zapytanie NTP skorygowało czas systemowy.

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

Podaje czas odniesienia w sekundach, który można wykorzystać do późniejszego porównania w celu pomiaru upływającego czasu.


4

Jeśli użyjesz mojego kodu (poniżej), czas pojawi się w sekundach, a następnie, po przecinku, w milisekundach. Myślę, że istnieje różnica między Windows i Unix - proszę o komentarz, jeśli tak jest.

from time import time

x = time()
print(x)

mój wynik (w systemie Windows) to:

1576095264.2682993

EDYCJA : Nie ma różnicy :) Dzięki tc0nn


1
Brak różnic w systemie Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Brak różnic na Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Te wielokrotności do 1000 w milisekundach mogą być przyzwoite do rozwiązania lub uczynienia pewnych warunków wstępnych akceptowalnymi. Można go użyć do wypełnienia luki w bazie danych, która tak naprawdę nigdy go nie używa. Chociaż w rzeczywistych sytuacjach, które wymagają precyzyjnego pomiaru czasu, ostatecznie się nie powiedzie. Nie sugerowałbym, aby ktokolwiek używał tej metody do operacji o znaczeniu krytycznym, które wymagają działań lub przetwarzania w określonym czasie.

Na przykład: pingi w obie strony mają 30-80 ms w USA ... Nie można tak po prostu zaokrąglić w górę i efektywnie wykorzystać.

Mój własny przykład wymaga zadań w każdej sekundzie, co oznacza, że ​​gdybym zaokrąglił w górę po odpowiedzi na pierwsze zadania, nadal ponosiłbym czas przetwarzania pomnożony przez każdy cykl głównej pętli. Skończyło się to całkowitym wywołaniem funkcji co 60 sekund. to ~ 1440 dziennie ... niezbyt dokładne.

To tylko myśl dla osób szukających dokładniejszego rozumowania, które nie jest w stanie rozwiązać luki w bazie danych, która tak naprawdę nigdy jej nie wykorzystuje.


2
Czy masz lepsze rozwiązanie? I szczerze mówiąc, w ogóle nie rozumiem tego, co mówisz. Co rozumiesz przez „zaokrąglanie w górę”?
Imperishable Night

2
Wyjaśnij swoje rozwiązanie z praktycznym przykładem lepszego zrozumienia
Ratan Uday Kumar,

0

Kolejne rozwiązanie wykorzystujące datetimemoduł Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.