【问题标题】:TypeError: can't compare offset-naive and offset-aware datetimesTypeError:无法比较偏移天真和偏移感知日期时间
【发布时间】:2015-06-15 15:08:54
【问题描述】:

托管我的db 的服务器位于U.S 中。当我向db 添加项目时,我希望使用Australia/Sydney 时间来存储时间。无论用户在哪个国家/地区,如果他们检索此记录,则应使用Australia/Sydney 时间返回。目前我正在这样做:

tz = pytz.timezone('Australia/Sydney')
orderDate = datetime.now(tz)
return add_order_to_db(orderID, orderDate, orderCost) # Adds an ORDER object to db

当我想为上述ORDER 对象更新orderDate 时,就会出现问题。

tz = pytz.timezone('Australia/Sydney')
orderDate = datetime.now(tz)

with contextlib.closing(DBSession()) as session:
    try:
        existingOrder = session.query(ORDER).filter_by(ORDERSID=orderID).first()
        existingOrder.ORDERSDATE = orderDate
        session.commit()
    except exc.SQLAlchemyError, error:
        session.rollback()
        raise_database_error(error)

ORDER 对象

class ORDER(Base):
__tablename__ = 'ORDERS'

ORDERSID = Column(Integer, primary_key=True)
ORDERSDATE = Column(DateTime, nullable=False)
ORDERSCOST = Column(Numeric(19, 4), nullable=False)

mySQL 中,ORDERSDATE 是一个Datetime 变量。

【问题讨论】:

  • 它看起来像MySQL-python doesn't support timezone-aware datetime objects。您可以尝试为 MySQL 数据库连接设置澳大利亚/悉尼时区并使用简单的日期时间对象(如果使用 TIMESTAMP 类型),或者在将时区信息放入数据库并在从数据库中检索时重新附加它之前剥离时区信息)。或者(更好)使用朴素的 datetime 对象来表示 UTC 时间(否则某些时间值可能不明确)

标签: python mysql datetime sqlalchemy


【解决方案1】:

仅通过将偏移量应用于当前 UTC 时间来保留 datetime 对象的原始偏移量如何?

 tz = pytz.timezone('Australia/Sydney')
 orderDate = datetime.datetime.now() +  tz._utcoffset

【讨论】:

  • 为什么要添加本地时间(可能在不同的时区)和可能对应于澳大利亚/悉尼某个时间点的 utc 偏移量的私有属性(没有必要添加与datetime.now()) 提到的时间有任何关系吗?顺便说一句,datetime.now(tz) 是在tz 时区获取当前时间的正确方法。
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2020-11-07
  • 2020-12-30
  • 2010-10-22
  • 2021-07-07
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多