Flask SQLAlchemy模型如何将date_created默认时间设为GMT-6时区
实现方法
要直接存储GMT-6时区的原生时间、不对存储流程加后处理,核心是给date_created字段提供一个可动态生成GMT-6当前时间的默认值函数,全程传入不带时区信息的naive datetime对象,避免数据库驱动自动做时区转换。
具体步骤
- 先导入需要的时间计算依赖:
from datetime import datetime, timedelta
- 编写专属的时间生成函数——GMT-6时区的时间比UTC时间慢6小时,直接基于UTC当前时间做偏移计算即可,不要引入带时区元数据的对象:
def get_gmt_minus6_time(): # 计算得到naive格式的GMT-6当前时间,不附带时区标识 return datetime.utcnow() - timedelta(hours=6)
- 把这个函数作为默认值传给模型字段,注意不要在函数名后加括号,要传入可调用对象本身:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.DateTime, nullable=False, default=get_gmt_minus6_time)
关键注意事项
- 不要把default值写成
default=get_gmt_minus6_time():这种写法会在模型类被加载时就生成一个固定时间,后续所有新建用户的创建时间都会和这个固定值完全一致,是常见的逻辑错误。 - 不要传入带时区信息的datetime对象:如果使用pytz等库生成附带GMT-6时区标识的时间对象,数据库驱动在写入时往往会自动将其转换为UTC格式存储,完全违背“不对存储数据做后处理”的要求。
- 不要直接使用无参数的
datetime.now():这个方法会读取服务器所在主机的本地时区时间,一旦部署环境的时区和目标GMT-6不一致,写入的时间值就会出现偏差。
内容的提问来源于stack exchange,提问作者dannisis
相关产品推荐
相关产品推荐

