Как правильно получить объекты datetime с указанием часового пояса из курсора cx_oracle?

1

cx_oracle возвращает экземпляры datetime для столбцов типов TIMESTAMP или TIMESTAMP WITH TIME ZONE, но эти экземпляры datetime не осведомлены о часовом поясе.

Например:

SELECT column_name, data_type FROM ALL_TAB_COLUMNS WHERE table_name = 'mytable';

column_name data_type
----------- ---------------------------
MYCOL       TIMESTAMP(6) WITH TIME ZONE

Как вы можете видеть, MYCOL - это TIMESTAMP, который осведомлен о часовом поясе. Я ожидал бы, что следующее вернет объект datetime Python, содержащий данные tzinfo. Однако:

>>> cxoracle_cursor.execute("select mycol from mytable")
>>> row = cx_oracle_cursor.fetchone()
>>> row['mycol']
datetime.datetime(2011, 6, 15, 8, 30)

Этот объект datetime не информирован о часовом поясе, поэтому я не могу надежно использовать эту дату в своем приложении.

Каков наилучший подход к извлечению этого столбца в качестве объекта datetime, который известен в часовом поясе?

Теги:
cx-oracle
internationalization

1 ответ

3

Здесь Я вижу следующее: Для данных TIMESTAMP WITH TIME ZONE значение datetime всегда находится в UTC, поэтому преобразование не требуется.

Итак, если вы не заметили часовой пояс объекта datetime, я понимаю, что он находится в UTC. Итак, вы можете сделать:

dt = pytz.utc.localize(row['mycol'])

Или попробуйте функцию SYS_EXTRACT_UTC (Извлекает UTC из даты и времени с смещением часового пояса), а затем с помощью pytz.utc.localize.

  • 3
    Спасибо за информацию. SYS_EXTRACT_UTC работает именно так, как вы упомянули, и может привести к решению, однако не похоже, что cx_oracle выполняет маршалинг mycol либо путем преобразования в дату-время UTC, либо путем добавления некоторой tzinfo к дате-времени. Похоже, он возвращает наивный объект datetime, локальный для любого часового пояса, в котором он хранится, как в Oracle (но без данных tzinfo).
  • 0
    Я получаю тот же результат, что и cx_Oracle : cx_Oracle просто возвращает объект datetime который является простым не cx_Oracle от часового пояса усечением TIMESTAMP WITH TIME ZONE .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню