【问题标题】:storing client datimetime with zone in postgresql table在 postgresql 表中存储带有区域的客户端日期时间
【发布时间】:2018-01-20 02:04:18
【问题描述】:

我想存储访问者上次访问我的烧瓶网页的次数。

我为此创建了 db

class TempTable(db.Model):
    __tablename__ = "tempTable"
    timeStamp = db.Column(types.Integer(), primary_key=True, autoincrement=True)
    moment = db.Column(types.Time(timezone=True)) 

    def __init__(self, tsz, moment):
        self.timeStamp = tsz
        self.moment = moment

但由于我希望将带有区域的访客日期时间存储在上表的 moment 列中,因此在我的烧瓶应用程序中,我正在创建带有时区的日期时间,如下所示:

`datetime.datetime.now(pytz.timezone(data["timezone"])).strftime("%Y-%m-%d %H:%M %z")`

然后将上述内容打入tempTablemoment列。

但是令人困惑的是我正在创建字符串对象,但 moment 列存储日期时间对象,所以不确定我做得对!

还是我只需要直接打datetime.datetime.now(pytz.timezone(data["timezone"]))

【问题讨论】:

    标签: datetime flask postgresql-9.4 pytz timestamp-with-timezone


    【解决方案1】:

    注意:在 cmets 之后更新

    import datetime
    
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from pytz import timezone
    from sqlalchemy import types
    
    app = Flask(__name__)
    app.config.update({
        'SQLALCHEMY_DATABASE_URI': "postgresql://user_pass_host_db",
    })
    
    db = SQLAlchemy(app)
    
    
    class TempTable(db.Model):
        __tablename__ = "tempTable"
        id = db.Column(types.Integer(), primary_key=True, autoincrement=True)
        moment = db.Column(types.Time(timezone=True))
    
    db.create_all()
    
    eastern = TempTable()
    warsaw = TempTable()
    
    eastern.moment = datetime.datetime.now(timezone('US/Eastern')).strftime("%H:%M:%S %z")
    warsaw.moment = datetime.datetime.now(timezone('Europe/Warsaw')).strftime("%H:%M:%S %z")
    # save our records and check data from db
    for i in [eastern, warsaw]:
        db.session.add(i)
        db.session.commit()
    
        last_moment = TempTable.query.order_by('-id').first().moment
        print('saved: time = %s' % last_moment.strftime("%H:%M:%S %z"))
    

    示例输出:

    saved: time = 14:16:39 -0400
    saved: time = 20:16:39 +0200
    

    数据库中的记录:

    14:16:39 -04:00
    20:16:39 +02:00
    

    如您所见,从数据库中提取后,您可以使用moment 进行任何操作。

    顺便说一句,在您的情况下,.strftime("%Y-%m-%d %H:%M %z") 无关紧要,因为您将types.Time(时间不是日期)用于字段moment

    【讨论】:

    • 是的,我早些时候尝试过,它可以工作。感谢您的回答 。?我相信时间应该始终保存在 Utd 中,时区在 db 中。
    • hello @Daniel,在第一个 utc 时间有来自 PostGreSQL 的 utc 时区,所以即使 UTC 时区被打入 moment 列,您也无法检索用户的实际时间,因为用户时区不是已知,在第二种情况下,我们确实有时区,但它的字符串格式化了,我相信在夏令时开启的情况下会搞砸。所以我认为这里需要做一些事情。截至目前,我已取消选中您接受的答案。
    • @Ciastopiekarz 哦。感谢您的反馈!我想我应该删除我的答案。你同意我的观点吗?
    • 您可以选择对此进行改进。可能对社区中的其他人有用
    • @Ciastopiekarz 我有一点时间。我更新了答案。希望这会有所帮助
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2010-12-22
    • 2015-08-04
    • 2014-01-16
    • 2012-10-08
    • 1970-01-01
    • 2019-07-05
    • 2013-04-19
    相关资源
    最近更新 更多