Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как получить время из PostgreSQL в том же самом часовом поясе, в котором и было изначально загружено в БД, вместо UTC?

#python #django #postgresql #timezone



Есть данные, которые через Django загружаются в базу в формате “2015-10-31 17:00:00+03”
(aware форма времени).
PostgreSQL имеет свойство сохранять время в UTC.
В pgAdmin-е я вижу время не в UTC, а в том виде, в котором было изначально загружено
значение, т.е. “2015-10-31 17:00:00+03”.


К примеру я загружаю новые данные, но перед заливкой в БД нужно сравнить эти данные
со значениями, которые уже есть в БД.
Новая порция идет в формате: 

"2015-10-31 17:00:00+03“,
а значения из БД вытягиваются уже в UTC, т.е. 

”2015-10-31 14:00:00+00".

Как сделать так, чтоб значение вытягивалось из БД не в UTC, а в том же часовом поясе,
в котором и было залито?

test = Shows.objects.get(name='Test')
test.date_time # выдает в UTC, а нужно чтоб было +3


П.С Хардкодить нельзя. Нужно получать именно тот часовой пояс из БД, что и был залит
изначально со значением, так как заливаться значения могут с разным часовым поясом.
    


Ответы

Ответ 1



Документация django говорит, что PostgreSQL преобразует местное время (время c часовой зоной, указанной для текущего соединения с базой данной) в UTC при сохранении и наоборот преобразует из UTC в местное время при чтении. Как сделать так, чтоб значение вытягивалось из БД не в UTC, а в том же часовом поясе, в котором и было залито? Если USE_TZ=True, то для соединения используется UTC временна́я зона, то есть postgresql видит только UTC. Если Вы сохраняете время, принадлежащее нескольким временны́м зонам, то дополнительно к самому времени с типом timestamptz, сохраняйте также и имя временно́й зоны (например, 'Europe/Kiev' или 'Europe/Moscow'). Если важно получить тоже самое локальное время, даже если правила изменились (если другая версия tzdata используется), то сохраняйте также явно текущий utc offset в минутах и другую необходимую информацию отдельно. Зная, UTC время и имя зоны, можно получить желаемое время (используя текущие правила (tzdata version)) в Питон коде: import pytz # $ pip install pytz local = utc.astimezone(pytz.timezone('Europe/Kiev')) Чтобы запросить время из базы данных напрямую в заданной временно́й зоне: select your_date at time zone 'Europe/Kiev' from your_table Зная, UTC время и utc offset в минутах: local = utc.astimezone(pytz.FixedOffset(120)) Чтобы получить время в текущей временно́й зоне для django (зона, которая используется для показа в шаблонах): from django.utils import timezone local = timezone.localtime(utc)

Ответ 2



Воспользуйтесь pytz >>> from datetime import datetime, timedelta >>> from pytz import timezone >>> import pytz >>> utc = pytz.utc >>> utc.zone 'UTC' >>> eastern = timezone('US/Eastern') >>> eastern.zone 'US/Eastern' >>> amsterdam = timezone('Europe/Amsterdam') >>> fmt = '%Y-%m-%d %H:%M:%S %Z%z' >>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) >>> print loc_dt.strftime(fmt) 2002-10-27 06:00:00 EST-0500 >>> ams_dt = loc_dt.astimezone(amsterdam) >>> ams_dt.strftime(fmt) '2002-10-27 12:00:00 CET+0100'

Комментариев нет:

Отправить комментарий