Кажется, bson
округляется до миллисекунд:
>>> from datetime import datetime
>>> import bson # $ pip install bson
>>> d = datetime.utcnow(); d, abs(d - bson.loads(bson.dumps({'utcnow': d}))['utcnow'].replace(tzinfo=None))
(datetime.datetime(2015, 2, 18, 23, 54, 47, 733092), datetime.timedelta(0, 0, 92))
Это задокументированное поведение:
UTC datetime — int64 — это миллисекунды UTC с эпохи Unix.
Если вам нужны микросекунды: вместо этого вы можете хранить целое число микросекунд с эпохи Unix:
from datetime import datetime
td = utc_dt - datetime(1970, 1, 1)
micros = td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6
Чтобы преобразовать микросекунды с эпохи Unix обратно в наивный объект даты и времени, который представляет время UTC:
from datetime import datetime, timedelta
utc_dt = datetime(1970, 1, 1) + timedelta(microseconds=micros)
int64 ("\x12") более чем достаточно для представления времени Unix с микросекундным разрешением (это в любом случае превышает диапазон datetime
).
Примечание. Временная метка POSIX «забывает» високосные секунды, например:
import time
tt = time.strptime("2015-07-01 01:59:60", "%Y-%m-%d %H:%M:%S")
ts_leap = time.mktime(tt)
tt = time.strptime("2015-07-01 02:00:00", "%Y-%m-%d %H:%M:%S")
ts_after = time.mktime(tt)
assert ts_leap == ts_after # assuming "right" timezone is not used
Если вы заботитесь о микросекундах; вы должны выяснить, что ваша система делает в високосные секунды.
Время (аппаратные часы, программные таймеры) на обычном компьютер не очень точен, поэтому разрешения в миллисекундах должно быть достаточно во многих случаях, например, если вы используете ntp
для синхронизации времени между компьютерами, тогда NTP v3 имеет точность 1-2 мс в локальной сети и 10 мс в глобальной сети.
Хотя иногда вы хотите сохранить цифры во вводе, даже если они неточны.
person
jfs
schedule
19.02.2015