SQLAlchemy的DateTime类型允许一个timezone=True参数将一个非天真的datetime对象保存到数据库中,并以此方式返回它。是否有任何方法可以修改tzinfo的时区,例如,SQLAlchemy传入的时区,例如UTC?我意识到我可以只使用default=datetime.datetime.utcnow;然而,这是一个天真的时间,它会很高兴地接受某个人传递一个天真的基于本地时间的日期时间,即使我与它一起使用timezone=True,因为它使本地或UTC的时间变得不天真,而没有一个基本的时区来规范它。我尝试过(使用比兹)使datetime对象不天真,但是当我将它保存到DB时,它会返回到朴素的状态。
请注意,datetime.datetime.utcnow如何不能很好地处理timezone=True:
import sqlalchemy as sa
from sqlalchemy.sql import select
import datetime
metadata = sa.MetaData('postgres://user:pass@machine/db')
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.utcnow)
)
metadata.create_all()
engine = metadata.bind
conn = engine.connect()
result = conn.execute(data_table.insert().values(id=1))
s = select([data_table])
result = conn.execute(s)
row = result.fetchone()(1,datetime.datetime(2009年,1,6,0,9,36,891887))
row[1].utcoffset()datetime.timedelta(-1,64800) #这是我的本地时间偏移量!!
datetime.datetime.now(tz=pytz.timezone("US/Central"))datetime.timedelta(-1,64800)
datetime.datetime.now(tz=pytz.timezone("UTC"))datetime.timedelta(0) #UTC
即使我将其更改为显式使用UTC:
..。
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)
row[1].utcoffset()..。
datetime.timedelta(-1,64800) #它没有使用我显式添加的时区
或者如果我放弃了timezone=True
..。
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(), default=datetime.datetime.now(tz=pytz.timezone('UTC')))
)
row[1].utcoffset() is None..。
True #这次它甚至没有将时区保存到db
https://stackoverflow.com/questions/414952
复制相似问题