LINUX.ORG.RU

Проблемы с датой/временем при выборке из монги

 , , , ,


0

1

Есть монга, в которую пишет сервис на go. В каждом документе есть поле -

m["ReceivedTimestamp"] = time.Now().UTC()
. Если делать выборку из монго шелла, то увидим «ReceivedTimestamp» : ISODate(«2018-01-19T07:06:43.453Z») Все правильно, пакет пришел в 10 часов по МСК, значит в utc было 7.

Делаю выборку из пайтона:

from pymongo import MongoClient
import datetime

r = next(collection.find(...).sort(...).limit(1))
dt: datetime.datetime = r['ReceivedTimestamp']
print(dt, dt.timestamp())

Выводит:

2018-01-19 07:06:43.453000 1516334803.453

Но 1516334803 это 4 утра в utc. Как правильно сконвертировать?

dt.strptime(dt.strftime('%Y%m%d-%H:%M:%S') + '+0000', '%Y%m%d-%H:%M:%S%z').timestamp())

Дает корректный таймстемп, но это костыльный костыль. Не нахожу, как сделать корректно.

panter_dsd ★★★★
() автор топика
Ответ на: комментарий от panter_dsd
datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, tzinfo=datetime.timezone.utc).timestamp()

Так уже получше.

panter_dsd ★★★★
() автор топика

Может попробовать модифицировать вызов поиска.
1. Поставить tzlocal:

pip install tzlocal

2. Изменить вызов:
import tzlocal

read_opts = { tzinfo=tzlocal.get_localzone() }
collection2 = collection.with_options(codec_options=read_opts)
r = next(collection2.find(...).sort(...).limit(1))
# И далее - как раньше


Не пользовался клиентом Mongo, но возможно опции кодека можно и в нём глобально проставить.
В общем, стоит посмотреть в сторону collection.with_options:
https://api.mongodb.com/python/current/api/pymongo/collection.html
https://api.mongodb.com/python/current/api/bson/codec_options.html#bson.codec...

Исходя из документации, вообще можно попробовать указать в codec_options поле tz_aware=True.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Ответ на: комментарий от sanwashere

Там строка с параметром конечно же так должна быть:

read_opts = { "tzinfo": tzlocal.get_localzone() }

Давно Python не трогал.

sanwashere ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.