在 postgresql 表中存储带有区域的客户端日期时间

Posted

技术标签:

【中文标题】在 postgresql 表中存储带有区域的客户端日期时间【英文标题】:storing client datimetime with zone in postgresql table 【发布时间】: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"]))

【问题讨论】:

【参考方案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 我有一点时间。我更新了答案。希望这会有所帮助

以上是关于在 postgresql 表中存储带有区域的客户端日期时间的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 通知和带有 Rails 的 WebSockets

将 postgresql 本地复制到远程数据库(都带有密码) - 错误:无法识别选项“区域设置”

使用带有 postgresql 表的 vba 填充组合框访问 2007

PostgreSQL PL/pgSQL:存储在表中的查询(营业时间)

Postgresql以存储在表中的类型返回变量

Hbase - 写操作