1

我有一个使用许多不同时区的应用程序......它将它们设置在控制器中,它们会根据用户而变化。所有时间都以 UTC 格式存储,没有时间戳等。

我的理解是这是 Rails 处理时区的正常方式。这在 99% 的情况下都可以正常工作,直到我需要直接使用 Postgres 做某事,然后时区就成了问题。

例如,除了 GMT 之外,这个查询是完全错误的,例如在中央时区,根据设置的小时,它会得到错误的日期:

Events.where("EXTRACT(dow FROM start_at)", Date.today.wday)

我试图找到某一天的所有日期。

我正在尝试做这样的事情。我不需要在时区之间搜索(它们不会混合),但如果不是 UTC,我确实需要指定时区才能获得正确的结果。

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", 'UTC', Date.today.wday)

但我不确定如何使用Time.zone给我一些可以在 Postgres 中使用 TIME ZONE 的东西。

Time.zone.tzinfo 有时有效... Postgres 将与“Europe/Warsaw”一起使用,但 Rails 返回“Europe - Warsaw”

一般来说,我对时区没有太多的运气,任何指针都将不胜感激。

4

3 回答 3

4

也许其他人有更好的整体解决方案,但特定查询需要的是

Time.zone.tzinfo.identifier

或者,在您的示例中:

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", Time.zone.tzinfo.identifier, Date.today.wday)
于 2013-10-03T16:14:06.420 回答
1

尝试直接使用 Ruby TZInfo gem,而不是使用 Rails ActiveSupport::TimeZone

或者,使用MAPPING常量,如ActiveSupport::TimeZone文档中所示,它将带您从 Rails 时区键回到 Postgres 和其他人使用的标准 IANA 时区标识符。

于 2013-10-03T23:59:49.787 回答
0

正如马特约翰逊建议的那样,直接使用 TZInfo gem。通过这种方式,您可以获得格式正确的时区标识符,您需要使用 PostgreSQL 进行查询。

例如,如果您使用:

TZInfo::Timezone.all_country_zone_identifiers

这将返回一组正确的 IANA/Olson 时区标识符。换句话说,您将得到正确的“欧洲/华沙”而不是“欧洲 - 华沙​​”。

于 2016-11-08T01:35:23.120 回答