Как создать метку времени до миллисекундной точности от date
или datetime
в Python?Преобразование даты, даты и времени в timestamp
Есть огромное количество методов и способов сделать это, и мне интересно, какой из них наиболее питонический.
Как создать метку времени до миллисекундной точности от date
или datetime
в Python?Преобразование даты, даты и времени в timestamp
Есть огромное количество методов и способов сделать это, и мне интересно, какой из них наиболее питонический.
Объекты даты в Python не сохраняют понятие времени покрова. Если вы хотите взять объект даты и получить представление с миллисекундой, это будет всего 0s.
Модуль datetime пропускает миллисекунды и поддерживает микросекунды в своем форматировании. Поэтому, когда вы печатаете дату или время в интерпретаторе, это последнее поле - микросекунда. Если вы хотите миллисекунды, вы можете разделить это поле на 1000.
Вот несколько примеров из сеанса интерпретатора Python 3.2b2. Здесь есть несколько дополнительных вещей, поэтому вы можете увидеть основной маршрут, который я взял, чтобы добраться до метки времени. Это не следует рассматривать как замену reading the docs:
>>> x = datetime.datetime.today()
>>> y = datetime.date.today()
>>> x
datetime.datetime(2011, 2, 6, 8, 2, 9, 465714)
>>> y
datetime.date(2011, 2, 6)
>>> y.strftime('%Y-%m-%d.%f')
'2011-02-06.000000'
>>> x
datetime.datetime(2011, 2, 6, 8, 2, 9, 465714)
>>> str(x)
'2011-02-06 08:02:09.465714'
>>> x.microsecond
465714
>>> x.time()
datetime.time(8, 2, 9, 465714)
>>> x.time().microsecond/1000
465.714 # milliseconds and microseconds.
>>> int(x.time().microsecond/1000)
465 # milliseconds
>>> s = '{:02d}:{:02d}:{:02d}.{:3d}'.format(r.hour, r.minute, r.second, int(r.microsecond/1000), '2s')
>>> s
'08:02:09.465'
Самый вещий способ зависит от того, что вы хотите, когда вы говорите «метку». Число или строка?
Для струн, d.isoformat()
является самым простым. Для номеров вы вам:
time.mktime(d.timetuple()) + d.microsecond/1000000.0
Это предполагает datetime
объектов. Я не уверен, что вы имеете в виду, когда говорите, что вам нужна метка времени с миллисекундой от объектов date
. Объекты date
даже не имеют секунд, а тем более миллисекунд. :-)
Следующая работает для моих целей:
Для DateTime из миллисекунды метки времени
import datetime
timestamp #=> 1317912250955
dt = datetime.datetime.fromtimestamp(time/1000.0)
dt #=> datetime.datetime(2011, 10, 6, 10, 44, 10, 955000)
От DateTime миллисекунды TIMESTAMP
import time
dt #=> datetime.datetime(2011, 10, 6, 10, 44, 10, 955000)
timestamp = int((time.mktime(dt.timetuple()) + dt.microsecond/1000000.0)*1000)
timestamp #=> 1317912250955
Осторожно, последняя операция интерпретирует данное время как локальное время, а не UTC! – Michael
Примечание. t unix timestamps традиционно UTC, а mktime() зависит от времени. Используйте calendar.timegm() (см. Http://stackoverflow.com/questions/2956886/python-calendar-timegm-vs-time-mktime). –