Postgres 或 Ruby 是否将时区添加到我的“没有时区的时间戳”列中?
如果我使用 SELECT current_setting('TIMEZONE') 查询数据库,我会得到“UTC”(如预期)。
使用 PgAdmin,我运行以下查询:
SELECT foo FROM bar
PgAdmin 显示“2011-03-12 08:00:00”。但是,当我从 Ruby 读取值时(据我所知,使用 DataMapper 它使用 'org.postgresql.Driver' JDBC 驱动程序),它显示“2011-03-12 08:00: 00 -0700”。
问题:时区添加到整个堆栈的哪个位置?尽管我意识到很大程度上取决于我的堆栈的具体情况,但这确实有助于理解应该发生什么,以便我可以排除问题。例如,对于没有时区的时间戳列,我是否应该期望 JDBC 驱动程序提供没有时区信息的“原始”值?
If I query my database with SELECT current_setting('TIMEZONE')
I get 'UTC' (as expected).
Using PgAdmin, I run the following query:
SELECT foo FROM bar
PgAdmin shows "2011-03-12 08:00:00". However, when I read the value from Ruby (using DataMapper which uses the 'org.postgresql.Driver' JDBC driver as far as I know), it shows "2011-03-12 08:00:00 -0700".
Question: Where in the whole stack is the timezone getting added? Although I realize a lot depends on the specifics of my stack, it would really help to understand what should happen so that I can rule things out. For example, for a timestamp without time zone
column, should I expect that JDBC driver gives a 'raw' value with no timezone information?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Ruby 中的某些功能正在进行时区调整:
您可以通过在 Ruby 中对时间戳执行原始 SQL 查询并查看返回的字符串来检查这一点。
Something in Ruby is making the timezone adjustment:
You can check this by doing a raw SQL query of a timestamp from within Ruby and seeing what string you get back.
当读取没有时区的时间戳时,JDBC 驱动程序会大胆/合理地假设该时间戳是用 JVM 时区表示的。
The JDBC driver when reading a timestamp without timezone makes bold/reasonable assumption that this timestamp is expressed in the JVM timezone.
如果您不想添加时区,请使用类型“timestamp without timezone”。
这样,读者将始终读取与您插入的相同的秒/小时/分钟/日/月/年。
我使用以下过程来重现
从 select 观察值,我得出的结论是
没有时区的时间戳永远不会被转换。无论您位于哪个时区,您都会读取相同的秒/小时/分钟/日/月/年所插入的内容。
If you do not want timezone to be added, use type 'timestamp without timezone'.
That way, reader will always read same second/hour/minute/day/month/year as you inserted.
I used following procedure to reproduce that
Observing values from select, I come to conclusion that
timestamp without timezone is never converted. You read same second/hour/minute/day/month/year what you inserted, no matter what timezone you are in.