在 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")`
然后将上述内容打入tempTable
的moment
列。
但是令人困惑的是我正在创建字符串对象,但 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