Uzyskaj aktualny czas w milisekundach w Pythonie?

531

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

Naftuli Kay
źródło
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
Naftuli Kay
źródło
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
Jason Polites
źródło
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ą.

zardosht
źródło
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

Wilson Wu
źródło
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))
Cadey
źródło
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
Pascal
źródło
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()
Laymain
źródło
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.

phord
źródło
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

PythonMaster202
źródło
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.

Mike Guidry
źródło
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())
Vikas
źródło