Python geçerli saat mi?


532

Python'da geçerli saati nasıl milisaniye olarak alabilirim?


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

4
@samplebias: bazı platformlarda ve python sürümlerinde time.time()olduğundan daha kötü bir hassasiyet sağlayabilir datetime.utcnow().
jfs

5
İtibaren milisaniye olarak ne zaman ? Çağdan bu yana demek istiyorsan (1 Ocak 1970 UTC gece yarısı),
şuna

2
Gerçek mikrosaniye çözünürlüklü milisaniye zaman damgaları için buraya bakın: stackoverflow.com/questions/38319606/…
Gabriel Staples

Yanıtlar:


710

İhtiyacım olan şey için, yukarıdaki @samplebias'ın yorumuna dayanarak yaptığım şey:

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

Quick'n'easy. Hepinize teşekkürler, beyin osuruğu için üzgünüm.

Yeniden kullanım için:

import time

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

Sonra:

>>> current_milli_time()
1378761833768

34
Bu doğru cevabı vermeyebilir. Dokümanlara göre, "Zaman her zaman bir kayan nokta sayısı olarak döndürülse bile, tüm sistemler 1 saniyeden daha iyi bir hassasiyetle zaman sağlamaz"
Jason Polites

11
Merak ediyorum, neden ihtiyacın var round? Bu int(time.time() * 1000)yeterli mi?
Maxim Vladimirsky

14
IMO Ben yuvarlak değil, zemin kullanırdım, ama bu sadece benim. Birisi saatin ne olduğunu sorarsa ve 7:32 ise, muhtemelen istedikleri sayı 8 değil, 7'dir.
davr

1
@ParallelUniverse: Windows'taki son CPython'da .utcnow()kullanırGetSystemTimeAsFileTime() . Olmaz time.clock()(call QueryPerformanceCounter()daha gürültüsü düşürebilir daha tanıtmak)? Bkz. Hassasiyet, doğruluk ile aynı değildir .
jfs

10
@MaximVladimirsky Bu int () davranışı değildir. Int bir değer katlamaz, sıfıra doğru yuvarlar. Hangi pozitif sayı için aynı şey, ama negatif için tersi. int (1.5) 1 verir, int (-1.5) -1 verir, matematik. zemin (-1.5) -2 verir Bkz: docs.python.org/2/library/stdtypes.html
Atla Huffman

91

time.time()sadece ikinciye çözünürlük verebilir, milisaniye için tercih edilen yaklaşımdır datetime.

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

94
oldukça kullanışlı değil - bu sadece dt'nin ikincisi içinde mikrosaniye verir . bkz. stackoverflow.com/a/1905423/74632
Boris Chervenkov

8
+1, çünkü bu sistemden güvenilir bir zaman damgası almanın resmi yoludur.
Pascal

16
-1. bu, bu sorunun yanlış bir cevabıdır. @Boris'in yorumladığı gibi, bu "mikrosaniye cinsinden zamanı" vermez, örneğin mikrosaniye sayısı cinsinden gün, saat, saniye içermez.
ja

3
+1 Bu doğru bir değer verir ve matematik nedeniyle aritmetik çalıştığı varsayılabilir. Eğer kullanıcının milisaniye / mikrosaniye cinsinden şimdiki zamana ihtiyacı varsa, basit aritmetik onları oraya götürecektir. Bir zaman deltasına ihtiyaç duyulursa - ki bu da istenmez - aritmetik, yine günü kaydeder.
Jack Stout

3
Zaman damgasının tamamını değil, geçerli zamanın mikrosaniyesini verir.
kawadhiya21


35

Gönderen 3.7 sürümüne kullanabilirsiniz time.time_ns()dönemin geçirilen nano saniye olarak zaman alır. Böylece yapabilirsin

ms = time.time_ns() // 1000000 

tamsayı olarak mili saniye cinsinden zaman elde etmek.


Bu benim için en iyisi oldu (Python 3.7.6)
Paul Watson

22

Sadece örnek kod:

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

Çıktı: 1534343781311


13

başka bir çözüm, kendi utils.py içine yerleştirebileceğiniz işlevdir

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

12

Kodunuzda milisaniyeyi datetime ile döndüren basit bir yöntem istiyorsanız:

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

bu, milisaniye cinsinden iki kez arasındaki farktır, yönteminizi @Jason s yanıtıyla birleştirmek, geçerli zaman damgasını milisaniye cinsinden verir ... Bunu start_timedüşünün , UNIX zaman damgası = datetime (1970,1,1)
PR

yerel saat belirsiz ve monoton olmayabilir (DST geçişleri veya yerel utc ofsetini değiştirmek için diğer nedenlerden dolayı). .utcnow()Bunun yerine kullanın veya mutlak zamana ihtiyacınız yoksa kullanabilirsiniz time.monotonous(). Not: gerçek bölme etkinleştirilmiş some_int + dt.microseconds/ 1000.0formül ( ) / 10**3ile kayan nokta aritmetiği arasında küçük bir fark vardır . Bkz açık formülü ve ilgili bağlantıyı total_seconds()ilgili yanıtında
jfs

7

Şu anki UTC saatini milisaniye olarak almanın en kolay yolu:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Geçen süreyi ölçmekten endişe ediyorsanız, monoton saati kullanmalısınız (python 3) . Bu saat, örneğin bir NTP sorgusunun sistem saatinizi ayarlayıp ayarlamadığını gördüğünüz gibi sistem saati güncellemelerinden etkilenmez.

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

Geçen süreyi ölçmek için daha sonra karşılaştırmak için kullanılabilecek saniye cinsinden bir referans süresi sağlar.


4

Kodumu kullanırsanız (aşağıda) süre saniye cinsinden, daha sonra ondalık bir milisaniyeden sonra görünür. Windows ve Unix arasında bir fark olduğunu düşünüyorum - varsa yorum yapın.

from time import time

x = time()
print(x)

Sonucum (Windows'ta):

1576095264.2682993

EDIT : Hiçbir fark yok :) Teşekkürler tc0nn


1
Mac OSX'te fark yok:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Ubuntu 18'de fark yok:python3 scratch.py 1577212763.9136133
tc0nn

1

Milisaniye için 1000'e kadar olan bu çarpımlar, bazı önkoşulları çözmek veya kabul etmek için uygun olabilir. Veritabanınızdaki gerçekten hiç kullanmayan bir boşluğu doldurmak için kullanılabilir. Bununla birlikte, kesin zamanlama gerektiren gerçek durumlar için sonuçta başarısız olur. Kimsenin eylemleri veya belirli zamanlamalarda işlem gerektiren kritik işlemler için bu yöntemi kullanmasını önermem.

Örneğin: ABD'de gidiş-dönüş pingler 30-80 ms'dir ... Bunu yuvarlayıp verimli bir şekilde kullanamazsınız.

Kendi örneğim her saniye görev gerektirir, yani ilk görevler yanıtlandıktan sonra yuvarlanırsam, işlem döngüsünün her ana döngü döngüsüyle çarpılacağı anlamına gelir. Bu, her 60 saniyede bir toplam işlev çağrısı oldu. Bu günde ~ 1440 .. çok doğru değil.

Sadece gerçekten kullanmayan bir veritabanı boşluğunu çözmenin ötesinde daha doğru bir akıl yürütme arayan insanlar için bir düşünce.


2
Daha iyi bir çözümün var mı? Ayrıca dürüst olmak gerekirse, söylediklerini hiç anlamıyorum. "Yuvarla" ile ne demek istiyorsun?
Kusursuz Gece

2
Çözümünüzü daha iyi anlamak için pratik bir örnekle açıklayın
Ratan Uday Kumar

0

datetimePython 3 modülünü kullanan başka bir çözüm .

datetime.datetime.timestamp(datetime.datetime.now())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.