我知道那里有几十个类似的问题,更不用说互联网上的无数文章了,但我仍然很难理解 Rails 如何在内部使用时区。
我目前有 config.time_zone = 'Eastern Time (US & Canada)'
在我的应用程序文件中配置,因为那是我和其他项目管理员所在的位置。拥有该网站的公司位于加利福尼亚州,因此他们将在太平洋时间。该应用程序拥有全局受众,虽然我们还没有这样做,但我们最终将实现用户首选的时区。
所以我目前的问题:
Time.now
与 Time.zone.now
与 Time.now.in_time_zone
与 DateTime.now
与 DateTime.now.in_time_zone
? config.time_zone
至 UTC
稍后?我是否必须重置我在数据库中的所有时间,或者它是否会影响旧时间? 最佳答案
首先,重要的是要了解 Rails 的时区内容主要是关于演示的。在幕后,一切都在 UTC 中发生。
一季度。在控制台 Rails 将显示默认时区的时间,所以 Something.last.created_at
在 Time.zone 给定的区域中显示该时间戳
Q2。所有这些都返回一个代表“现在”的对象。 DateTime 与 Time 的选择与时区无关。例如,如果您需要能够表示 unix 纪元之外的时间,请使用 DateTime。 Time.now
的区别和 Time.zone.now
是您是否取回 Time 实例(它将作为 Controller 位于服务器的本地时区)。这控制例如什么 to_s
返回但不代表什么瞬间:
SomeModel.create(:time_attribute => Time.now)
SomeModel.create(:time_attribute => Time.zone.now)
将同一行插入到数据库中。如果您只是向用户显示时间(例如,如果您的站点在标题中显示当前时间),那么您应该使用
Time.zone.now
以便它显示在正确的时区中。如果您只是将它存储在数据库中,那么它并不重要 - activerecord 无论如何都会将其转换为 TimeWithZone。Q3。
TimeWithZone
上的比较方法是通过比较日期的 utc 版本来实现的,因此您可以安全地比较不同区域中的时间 - 您不需要将它们转换为某个常见的时区。您还可以将 TimeWithZone 实例与普通时间对象进行比较。第 4 季度。你通常不需要做任何事情。一种常见的实现方式是使用
published_at
模型上的属性。显示列表文章的页面会添加一个where('published_at <= ?', Time.now)
查询的条件。当您创建文章时,Rails 从表单中获取日期时间并将其转换为 utc,因此数据库中存储的是该
published_at
的 utc 版本。时间。比较与时区无关,因此无论时区是什么,查询都可以正常工作。这可能会因一天中的纯时间(例如“下午 4 点”)而变得复杂,因为时区转换只有在您也知道日期(即您知道准确的时间)时才能正确完成,这取决于 DST(或政治诸如国家/地区更改时区之类的事件)与 UTC 的偏移量发生变化。在这种情况下,您通常只想存储一天中的时间,并尽可能晚地将其转换为完整时间,当您也知道日期时。
Q5. Rails 总是将 UTC 存储在数据库中。这样做的直接后果是改变
config.time_zone
不需要您更改存储在数据库中的数据。您甚至可以设置 Time.zone
以每个用户为基础,以便用户看到他们所在时区的时间 - config.time_zone
只控制 Time.zone 的默认值
关于ruby-on-rails-3 - 帮助了解 Rails 3 中的时间和时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6495822/