Отримати поточний час у мілісекундах в Python?


531

Як я можу отримати поточний час у мілісекундах в Python?


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

4
@samplebias: time.time()може забезпечити гіршу точність, ніж datetime.utcnow()на деяких платформах та версіях python.
jfs

5
У мілісекундах з тих пір, коли ? Якщо ви маєте на увазі з епохи (опівночі 1 січня 1970 UTC), дивіться це: stackoverflow.com/questions/18169099/…
Майкл Шепер

2
Дійсні міксели часу мікросекунди з роздільною здатністю дивіться тут: stackoverflow.com/questions/38319606/…
Габріель Штаплес

Відповіді:


710

Що мені було потрібно, ось що я зробив, грунтуючись на коментарі @samplebias вище:

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

Швидкий 'легкий. Спасибі всім, вибачте за мозок пердеть.

Для повторного використання:

import time

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

Тоді:

>>> current_milli_time()
1378761833768

34
Це може не дати правильної відповіді. Згідно з документами, "Зауважте, що хоча час завжди повертається як число з плаваючою комою, не всі системи надають час з кращою точністю, ніж 1 секунда"
Джейсон Політес

11
Мені цікаво, навіщо це потрібно round? Здається int(time.time() * 1000), достатньо?
Максим Володимирський

14
IMO я б використовував підлогу, а не круглу, але це тільки я. Якщо хтось запитує, яка година, і це 7:32, то число, ймовірно, хочуть, це 7, а не 8.
дав

1
@ParallelUniverse: .utcnow()використовує GetSystemTimeAsFileTime()останній CPython у Windows . Не time.clock()закликає ( QueryPerformanceCounter()) вводити більше шуму, ніж це може зменшити? Дивіться Точність - це не те саме, що точність .
jfs

10
@MaximVladimirsky Це не поведінка int (). Int не відповідає значенню, він округляється до нуля. Яке те саме для позитивного числа, але зворотне для негативного. int (1.5) дає 1, int (-1.5) дає -1, math.floor (-1.5) дає -2 Див.: docs.python.org/2/library/stdtypes.html
Пропустити Хаффмана

91

time.time()може давати дозвіл лише на другий, кращим підходом протягом мілісекунд є datetime.

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

94
не зовсім корисно - це дає лише мікросекунди протягом секунди dt. дивіться stackoverflow.com/a/1905423/74632
Борис Червенков

8
+1, оскільки це офіційний спосіб отримати надійну мітку часу від системи.
Паскаль

16
-1. це неправильна відповідь на це питання. як коментує @Boris, це не дає "часу в мікросекундах", наприклад, не включає днів, годин, секунд у кількості мікросекунд.
ja

3
+1 Це дає правильне значення, і арифметику можна вважати, що вона працює, тому що математика. Якщо користувачеві потрібен поточний час у мілісекундах / мікросекундах, проста арифметика отримає їх там. Якщо потрібна дельта часу - чого не потрібно - арифметика, знову ж, економить день.
Jack Stout

3
Дає мікросекунди поточного часу, а не всієї мітки часу.
kawadhiya21

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

3
ви можете вкласти формулу для .total_seconds()отримання (можливо) кращої точності: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(з увімкненим істинним поділом) Або якщо ви хочете усікати мілісекунди, тоді використовуйте // 10**3.
jfs

1
Здається, це найкраща відповідь, якщо використовувати datetime
dlsso

35

Від версії 3.7 ви можете використовувати time.time_ns()час, коли пройшли наносекунди від епохи. Так ви можете зробити

ms = time.time_ns() // 1000000 

щоб отримати час у мілі-секундах як ціле число.


Це найкраще працювало для мене (Python 3.7.6)
Пол Уотсон


13

Ще одне рішення - це функція, яку можна вбудувати у свій utils.py

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

12

Якщо ви хочете простий метод у вашому коді, який повертає мілісекунди з датою:

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

це різниця між двома разів у мілісекундах, поєднання вашого методу з відповіддю @Jason дає поточну позначку часу в мілісекундах ... Думаючи про це, часова мітка UNIX буде вашим методом з start_time= datetime (1970,1,1)
PR

місцевий час може бути неоднозначним та неодноманітним (через переходи DST або інші причини зміни локального компенсації утта). Використовуйте .utcnow()натомість або якщо вам не потрібен абсолютний час, тоді ви можете використовувати time.monotonous(). Примітка. Існує незначна різниця через арифметику з плаваючою комою між some_int + dt.microseconds/ 1000.0та формулою ( ) / 10**3з увімкненим істинним поділом. Див явну формулу і посилання total_seconds()на відповідну відповідь
JFS

7

Найпростіший спосіб, який я знайшов, щоб отримати поточний час UTC в мілісекундах:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Якщо ви стурбовані вимірюванням минулого часу, вам слід скористатися монотонним годинником (пітон 3) . На цей годинник не впливають оновлення системних годин, як ви побачили, чи запит NTP коригував, наприклад, ваш системний час.

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

Він забезпечує опорний час у секундах, який можна використати для порівняння пізніше для вимірювання минулого часу.


4

Якщо ви використовуєте мій код (нижче), час з’явиться в секундах, після десяткових мілісекунд. Я думаю, що між Windows та Unix є різниця - будь ласка, прокоментуйте, якщо є.

from time import time

x = time()
print(x)

мій результат (у Windows):

1576095264.2682993

EDIT : Різниці немає :) Дякую tc0nn


1
Немає відмінностей на Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Немає відмінностей на Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Ці множення до 1000 за мілісекунди можуть бути пристойними для вирішення або прийняття якоїсь необхідної умови. Він може бути використаний для заповнення прогалини у вашій базі даних, яка насправді ніколи не використовує її. Хоча для реальних ситуацій, які потребують точних термінів, це в кінцевому рахунку не вдасться. Я б не пропонував нікому використовувати цей метод для критично важливих операцій, які вимагають дій або обробки в певні терміни.

Наприклад: пінг-рейси в США становлять 30-80 мс ... Ви не могли просто закруглити це і використовувати його ефективно.

Мій власний приклад вимагає завдань щосекунди, це означає, що якщо я округлювався після того, як відповіли перші завдання, я все-таки зазнав би час обробки, помножений на кожен основний цикл циклу. Це закінчилося загальним викликом функції кожні 60 секунд. це ~ 1440 в день .. не надто точно.

Просто думка для людей, які шукають більш точні міркування, крім вирішення розриву бази даних, які ніколи насправді не використовують.


2
Чи маєте ви краще рішення? Крім того, чесно, я взагалі не розумію, про що ви говорите. Що ви маєте на увазі під "округлим"?
Непрохідна ніч

2
Поясніть своє рішення на практичному прикладі для кращого розуміння
Ратан Удай Кумар

0

Ще одне рішення з використанням datetimeмодуля для Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.