如何从cx_oracle游标正确获取时区感知的日期时间对象?

2 投票
1 回答
2412 浏览
提问于 2025-04-16 18:18

cx_oracle这个库在处理数据库中的类型的列时,会返回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是一个带有时区信息的。我本以为下面的代码会返回一个包含时区信息的Python datetime对象。但是:

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

这个datetime对象并没有时区信息,所以我无法在我的应用程序中可靠地使用这个日期。

那么,获取一个包含时区信息的datetime对象的最佳方法是什么呢?

1 个回答

3

在这个链接中,我看到这样一句话:对于带时区的时间戳数据,日期时间值总是以UTC格式表示,所以不需要转换。

所以,如果你得到的datetime对象没有时区信息,我明白它是以UTC格式表示的。那么你可以这样做:

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

或者可以尝试使用SYS_EXTRACT_UTC这个函数(从带时区偏移的日期时间中提取UTC时间),然后再用pytz.utc.localize

撰写回答