SqlAlchemy конвертирует UTC DateTime в локальное время перед сохранением

У меня есть следующая ситуация: – Бэкэнд Postgres с полем

timestamp without time zone 
  • Прямо перед сохранением значения datetime это выглядит так: 2014-09-29 06: 00: 00 + 00: 00
  • Затем я загружаю ту же строку из db, и значение равно: 2014-09-29 09:00:00

Таким образом, в базе данных сохраненная дата больше не 6AM .. но 9AM – она ​​преобразована в мой местный часовой пояс.

Я не понимаю, что происходит. Почему сохраненная дата конвертируется в локальную?

Благодарю.

редактировать

Поэтому после ответа @ univerio я попробовал что-то: я удалил tzinfo с даты, сделав

 .replace(tzinfo = None) 

И теперь дата сохраняется правильно – она ​​не корректирует ее по местному времени. Я не совсем понимаю, почему поэтому я оставлю вопрос открытым, если у кого-то есть объяснение.

Благодарю.

  • Запрос фильтра SQLAlchemy связанным объектом
  • Как select_related () в Flask / SQLAlchemy?
  • Обновление строки в SqlAlchemy ORM
  • SQLAlchemy - Написание гибридного метода для подсчета количества детей
  • Соединение много-ко многим мульти-базам данных с Flask-SQLAlchemy
  • SQLAlchemy create_all () не создает таблицы
  • SqlAlchemy mysql миллисекунда или микросекундная точность
  • создание временной таблицы из запроса с использованием sqlalchemy orm
  • One Solution collect form web for “SqlAlchemy конвертирует UTC DateTime в локальное время перед сохранением”

    То, что я подозреваю, происходит, это то, что вы правильно храните достоверное время datetime s, но не читаете его с часовым поясом, потому что столбец WITHOUT TIME ZONE . Каждое соединение PostgreSQL имеет связанный часовой пояс, который по умолчанию соответствует часовому поясу системы, поэтому, когда вы извлекаете определенный TIMESTAMP он возвращается как наивное время и время в часовом поясе системы. По этой причине я всегда рекомендую хранить TIMESTAMP WITH TIME ZONE .

    Если вы хотите изменить часовой пояс соединения в SQLAlchemy на UTC, выполните следующие действия при создании движка:

     engine = create_engine("...", connect_args={"options": "-c timezone=utc"}) 

    Это должно заставить вас прочитать значение обратно как наивное datetime в UTC.

    EDIT: @Peter В документации не делается очевидным, как это сделать; Мне пришлось читать несколько разных документов и подключать точки:

    1. SQLAlchemy документации о connect_args которая позволяет передавать аргументы непосредственно в DBAPI connect()
    2. документацию psycopg2 на connect , в которой рассказывается о дополнительных параметрах, которые вы можете передать libpq
    3. документацию libpq по параметру options который позволяет передавать параметры командной строки при подключении с помощью libpq
    4. в документации PostgreSQL о командной строке -c которая позволяет изменять настройки конфигурации
    5. наконец, документацию клиента PostgreSQL о настройке клиента timezone которую вы можете установить
    Python - лучший язык программирования в мире.