метка времени в Unix с точностью до миллисекунды - PullRequest
29 голосов
/ 17 ноября 2011

Я пытаюсь сделать что-то действительно простое, преобразовать объект datetime через три дня в будущее в метку времени UTC Unix:

import datetime, time
then = datetime.datetime.now() + datetime.timedelta(days=3)
# Method 1
print then.strftime("%s")
# Method 2
print time.mktime(then.timetuple())
# Method 3 
print time.mktime(then.timetuple()) * 1000

Метод 1 и 2 дают мне время Unix в секунд , а не миллисекунд, а метод 3 дает мне миллисекунды без фактической точности в миллисекундах.

Когда я просто печатаю then, я получаю datetime.datetime(2011, 11, 19, 15, 16, 8, 278271), поэтому я знаю, что точность доступна для миллисекунд.Как я могу получить метку времени Unix с точностью до миллисекунды?Если он возвращается как число с плавающей запятой, и мне нужно сгладить его до int, это нормально.Есть ли решение, которое я ищу, чтобы это сделать?

Ответы [ 6 ]

42 голосов
/ 17 ноября 2011

Объекты Datetime имеют поле с именем microsecond. Итак, один из способов достичь того, что вам нужно, это:

time.mktime(then.timetuple())*1e3 + then.microsecond/1e3

Возвращает миллисекунды с эпохи UNIX с необходимой точностью.

10 голосов
/ 21 марта 2014

В Python 3.3 и выше, которые поддерживают метод datetime.timestamp(), вы можете сделать это:

from datetime import datetime, timezone, timedelta

(datetime.now(timezone.utc) + timedelta(days=3)).timestamp() * 1e3
5 голосов
/ 22 марта 2014

День всегда равен 86400 секундам во времени POSIX.Чтобы получить метку времени POSIX через 3 дня в будущем как число с плавающей запятой (с долей секунды):

import time

DAY = 86400 # seconds
future = time.time() + 3 * DAY

Предполагается, что time.gmtime(0) - это 1970 (эпоха POSIX).

Если выуже есть наивный объект datetime, который представляет время в местном часовом поясе, тогда временная метка может быть неоднозначной во время переходов DST.Чтобы избежать двусмысленности, вы можете использовать объект datetime с учетом часового пояса или наивный объект datetime, который представляет время в формате UTC.

Чтобы преобразовать локальное значение datetime dt в секунды с начала эпохи:

from datetime import datetime
from time import mktime

timestamp = dt.timestamp() # Python 3.3+
timestamp = mktime(dt.timetuple()) + dt.microsecond / 1e6 # Python 2.7

Может произойти сбой, если в прошлом местный часовой пояс имел различное смещение utc, а реализация time не имеет доступа к базе данных часовых поясов в системе.Для обработки таких случаев используйте pytz.

Чтобы преобразовать дату и время UTC utc_dt в метку времени POSIX:

timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()

Чтобы получить миллисекунды, просто умножьте любое число с плавающей запятой на 1e3..

4 голосов
/ 14 декабря 2012
long((time.time() + 0.5) * 1000)

с точностью до миллисекунды

1 голос
/ 25 января 2017

Если придерживаться даты и времени в UTC, вы можете использовать эту абстракцию и использовать timedelta:

from datetime import datetime, timedelta

epoch = datetime.utcfromtimestamp(0)

def dt_from_ms(ms):
    return datetime.utcfromtimestamp(ms / 1000.0)

def dt_to_ms(dt):
    delta = dt - epoch
    return int(delta.total_seconds() * 1000)

затем:

now = datetime.utcnow()
now
-> datetime.datetime(2017, 1, 25, 1, 30, 42, 765846)  # note microsecond precision

dt_to_ms(now)
-> 1485307842765

dt_from_ms(1485307842765)
-> datetime.datetime(2017, 1, 25, 1, 30, 42, 765000)  # note millisecond precision

then = now + timedelta(days=3)
dt_to_ms(then)
-> 1485567042765

(1485567042765 - 1485307842765) / (24*60*60*1000.0)
-> 3.0
0 голосов
/ 17 ноября 2011

Если вы используете Python 2.7 или 3.2+, вы можете использовать timedelta.total_seconds(), чтобы получить это довольно легко:

import datetime, time
print time.time() + datetime.timedelta(days=3).total_seconds()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...