ruby-on-rails - 在 Postgres 中复制 Rails 时区的“魔法”
问题描述
有没有办法让 Postgres(我使用 Navicat,但将通过命令行工具进行演示)的行为方式与 Rails 在时区和 UTC 方面的行为方式相同?
Rails 似乎做了一些让 Postgres 以 UTC 方式运行的魔法。而通过命令行(或 Navicat),它使用的是我的系统时区。这很令人困惑,因为结果会根据我是在 Ruby/Rails 中还是在控制台中执行查询而有所不同。
我仍然在 Postgres 中与时区作斗争,但是让 Rails 和控制台表现出不同的行为令人抓狂。我可以补救吗?
这是一个示例(不同的输出值):
-- in postgress:
# select ('2018-11-06' at time zone 'utc')::timestamptz;
timezone
------------------------
2018-11-06 08:00:00-08
(1 row)
-- in rails console
> ApplicationRecord.execute("select ('2018-11-06' at time zone 'utc')::timestamptz").first
(0.5ms) select ('2018-11-06' at time zone 'utc')::timestamptz
=> #<OpenStruct timezone="2018-11-06 00:00:00+00">
它们的格式都不同(-00
vs -08
),更令人困惑的是,它们返回的实际时间不同。
Postgres 示例比 Rails 提前 16 小时返回结果!
解决方案
在我的理解中,这不是 Rails 的魔法,而是 Rails 只是使用 UTC 作为默认值。这就是为什么 Rails 可以并且确实使用与默认数据库类型等timezone
相反的timezonetz
东西的原因。created_at
您可以根据需要修改 Rails 默认时区,如下所示(参见官方参考):
# application.rb:
class Application < Rails::Application
config.time_zone = 'Eastern Time (US & Canada)'
end
至于 PostgreSQL,你的结果并不领先;您的默认时区似乎位于美洲大陆的某个地方(比 UTC 晚 8 小时)。您可以按如下方式检查:
postgres=> SET TIME ZONE 'America/New_York';
postgres=> select ('2018-11-06' at time zone 'UTC')::timestamptz;
timezone
------------------------
2018-11-06 05:00:00-05
(1 row)
我不知道有什么Navicat
作用。但也许看看你的postgresql.conf
. 如果需要,您可以将您的重置timezone
为 UTC(并重新启动 postgreSQL 服务器)。有关更多详细信息,请参见“postgres 默认时区”的答案。
推荐阅读
- emacs - 组织模式 [[file: ]] 链接到具有特定 :PROPERTIES: :ID: 的文件:
- ios - SwiftUI:工作表第一次无法显示正确的值
- javascript - 如何配置 axios 基础 URL?
- algorithm - 高效的最大流量算法将尽可能多的人路由到一个位置?
- linux - 添加一个新的系统调用 Linux 5-9.8 并使其出现在启动屏幕上
- python - 如何修复“列表分配索引超出范围”?
- python - 如何在pyqt5中添加底部阴影效果?
- entity-framework - SelectList 中的不同列用于下拉列表
- xamarin - 在特定位置打开弹出窗口 - Xamarin.Forms
- c - 使用c中的系统调用逐个字符读取文件