Dapatkan waktu saat ini dalam milidetik dalam Python?


532

Bagaimana saya bisa mendapatkan waktu saat ini dalam milidetik dengan Python?


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

4
@samplebias: time.time()mungkin memberikan presisi yang lebih buruk daripada datetime.utcnow()pada beberapa platform dan versi python.
jfs

5
Dalam milidetik sejak kapan ? Jika yang Anda maksud sejak zaman (tengah malam 1 Januari 1970 UTC), lihat ini: stackoverflow.com/questions/18169099/…
Michael Scheper

2
Untuk prangko waktu milidetik resolusi mikrodetik yang benar lihat di sini: stackoverflow.com/questions/38319606/…
Gabriel Staples

Jawaban:


710

Untuk apa yang saya butuhkan, inilah yang saya lakukan, berdasarkan komentar @samplebias di atas:

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

Cepat mudah. Terima kasih semua, maaf untuk kentut otak.

Untuk digunakan kembali:

import time

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

Kemudian:

>>> current_milli_time()
1378761833768

34
Ini mungkin tidak memberikan jawaban yang benar. Menurut dokumen, "Perhatikan bahwa meskipun waktu selalu dikembalikan sebagai angka floating point, tidak semua sistem menyediakan waktu dengan ketepatan yang lebih baik daripada 1 detik"
Jason Polites

11
Saya bertanya-tanya, mengapa Anda perlu melakukannya round? Sepertinya int(time.time() * 1000)sudah cukup?
Maxim Vladimirsky

14
Saya akan menggunakan lantai dan tidak bulat, tapi itu hanya saya. Jika seseorang bertanya jam berapa, dan jam 7:32, jumlah yang mereka inginkan adalah jam 7, bukan jam 8.
davr

1
@ ParallelUniverse: .utcnow()digunakan GetSystemTimeAsFileTime()pada CPython terbaru di Windows . Tidakkah time.clock()panggilan ( QueryPerformanceCounter()) menimbulkan lebih banyak noise daripada yang mungkin dikurangi? Lihat Presisi tidak sama dengan akurasi .
jfs

10
@ MaximVladimirsky Itu bukan perilaku int (). Int tidak memberi nilai pada lantai, ia membulat ke nol. Yang merupakan hal yang sama untuk angka positif, tetapi sebaliknya untuk negatif. int (1.5) memberi 1, int (-1.5) memberi -1, math.floor (-1.5) memberi -2 Lihat: docs.python.org/2/library/stdtypes.html
Skip Huffman

91

time.time()mungkin hanya memberikan resolusi untuk yang kedua, pendekatan yang lebih disukai untuk milidetik adalah datetime.

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

94
tidak cukup berguna - ini hanya memberi Anda mikrodetik dalam detik dt. lihat stackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1 karena ini adalah cara resmi untuk mendapatkan cap waktu yang andal dari sistem.
Pascal

16
-1. ini jawaban yang salah untuk pertanyaan ini. seperti yang dikomentari @Boris, ini tidak memberikan "waktu dalam mikrodetik", misalnya tidak termasuk hari, jam, detik dalam jumlah mikrodetik.
ja

3
+1 Ini memberikan nilai yang benar dan aritmatika dapat dianggap berhasil karena matematika. Jika pengguna membutuhkan waktu saat ini dalam milidetik / mikrodetik, aritmatika sederhana akan mendapatkannya di sana. Jika diperlukan waktu delta - yang tidak diminta - aritmatika, sekali lagi, hematlah hari itu.
Jack Stout

3
Memberikan mikrodetik waktu saat ini, bukan seluruh cap waktu.
kawadhiya21

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

3
Anda dapat menguraikan rumus untuk .total_seconds()menghasilkan (mungkin) presisi yang lebih baik: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(dengan pembagian yang benar diaktifkan) Atau jika Anda ingin memotong milidetik kemudian gunakan // 10**3.
jfs

1
Ini sepertinya menjadi jawaban terbaik jika menggunakan datetime
dlsso

35

Dari versi 3.7 Anda dapat menggunakan time.time_ns()untuk mendapatkan waktu yang berlalu nano detik dari zaman. Jadi kamu bisa melakukannya

ms = time.time_ns() // 1000000 

untuk mendapatkan waktu dalam mili detik sebagai integer.


Ini bekerja paling baik untuk saya (Python 3.7.6)
Paul Watson

22

Hanya kode sampel:

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

Output: 1534343781311


13

solusi lain adalah fungsi yang dapat Anda embed ke dalam utils.py Anda sendiri

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

12

Jika Anda menginginkan metode sederhana dalam kode Anda yang mengembalikan milidetik dengan 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

ini adalah perbedaan antara dua kali dalam milidetik, menggabungkan metode Anda dengan jawaban @Jason memberi cap waktu saat ini dalam milidetik ... Berpikir tentang itu, cap waktu UNIX akan menjadi metode Anda dengan start_time= datetime (1970,1,1)
PR

waktu lokal mungkin ambigu dan tidak monoton (karena transisi DST atau alasan lain untuk mengubah offset utc lokal). Gunakan .utcnow()sebagai gantinya atau jika Anda tidak membutuhkan waktu absolut maka Anda bisa menggunakannya time.monotonous(). Catatan: ada perbedaan halus karena aritmatika titik-mengambang antara some_int + dt.microseconds/ 1000.0dan formula ( ) / 10**3dengan pembagian yang benar diaktifkan. Lihat rumus eksplisit dan tautannya total_seconds()dalam jawaban terkait
jfs

7

Cara paling sederhana yang saya temukan untuk mendapatkan waktu UTC saat ini dalam milidetik adalah:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Jika Anda khawatir tentang mengukur waktu yang telah berlalu, Anda harus menggunakan jam monoton (python 3) . Jam ini tidak terpengaruh oleh pembaruan jam sistem seperti yang Anda lihat jika kueri NTP menyesuaikan waktu sistem Anda, misalnya.

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

Ini memberikan waktu referensi dalam detik yang dapat digunakan untuk membandingkan nanti untuk mengukur waktu yang berlalu.


4

Jika Anda menggunakan kode saya (di bawah), waktu akan muncul dalam detik, kemudian, setelah desimal, milidetik. Saya pikir ada perbedaan antara Windows dan Unix - tolong beri komentar jika ada.

from time import time

x = time()
print(x)

hasil saya (pada Windows) adalah:

1576095264.2682993

EDIT : Tidak ada perbedaan :) Terima kasih tc0nn


1
Tidak ada perbedaan pada Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Tidak ada perbedaan pada Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Perkalian ini menjadi 1000 untuk milidetik mungkin layak untuk menyelesaikan atau membuat beberapa prasyarat dapat diterima. Ini dapat digunakan untuk mengisi celah di basis data Anda yang tidak benar-benar menggunakannya. Meskipun, untuk situasi nyata yang membutuhkan pengaturan waktu yang tepat, akhirnya akan gagal. Saya tidak akan menyarankan siapa pun menggunakan metode ini untuk operasi kritis misi yang memerlukan tindakan, atau pemrosesan pada waktu tertentu.

Sebagai contoh: ping pulang pergi menjadi 30-80 ms di Amerika Serikat ... Anda tidak bisa hanya menyimpulkannya dan menggunakannya secara efisien.

Contoh saya sendiri memerlukan tugas di setiap detik yang berarti jika saya mengumpulkan setelah tugas pertama merespons saya masih akan dikenakan waktu pemrosesan dikalikan setiap siklus loop utama. Ini akhirnya menjadi panggilan fungsi total setiap 60 detik. itu ~ 1440 sehari .. tidak terlalu akurat.

Hanya pemikiran untuk orang-orang yang mencari alasan yang lebih akurat di luar penyelesaian kesenjangan database yang tidak pernah benar-benar menggunakannya.


2
Apakah Anda memiliki solusi yang lebih baik? Sejujurnya, saya tidak mengerti apa yang Anda katakan. Apa yang Anda maksud dengan "mengumpulkan"?
Imperishable Night

2
Jelaskan solusi Anda dengan contoh praktis untuk pemahaman yang lebih baik
Ratan Uday Kumar

0

Hanya solusi lain menggunakan datetimemodul untuk Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.