ruby-on-rails-3 - 帮助了解 Rails 3 中的时间和时区

标签 ruby-on-rails-3 datetime comparison timezone

我知道那里有几十个类似的问题,更不用说互联网上的无数文章了,但我仍然很难理解 Rails 如何在内部使用时区。

我目前有 config.time_zone = 'Eastern Time (US & Canada)'在我的应用程序文件中配置,因为那是我和其他项目管理员所在的位置。拥有该网站的公司位于加利福尼亚州,因此他们将在太平洋时间。该应用程序拥有全局受众,虽然我们还没有这样做,但我们最终将实现用户首选的时区。

所以我目前的问题:

  • 我知道 Rails 在分别存储和检索时神奇地将日期时间列值转换为 UTC 和从 UTC 转换,但是查看给定日期时间属性的本地版本的正确方法是什么?
  • 什么时候用Time.nowTime.zone.nowTime.now.in_time_zoneDateTime.nowDateTime.now.in_time_zone ?
  • 将给定的日期时间属性与上面列出的方法或相对于当前配置的时区的其他特定时间进行比较的正确方法是什么?用UTC?
  • 我们会有一些时间敏感的东西,比如需要根据应用程序的时区在特定时间发布的文章,那么我如何让应用程序在我们指定的时区进行比较而不是当前配置的时区(假设一个实现了用户时区?)
  • (新问题)如果我改变了会怎样config.time_zoneUTC稍后?我是否必须重置我在数据库中的所有时间,或者它是否会影响旧时间?
  • 最佳答案

    首先,重要的是要了解 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/

    相关文章:

    ruby-on-rails - 在 Rails 中使用演示者

    ruby-on-rails - rails 制动器命令 sql 注入(inject)

    file - 触摸文件以更新文件的日期时间? (修改日期)(Windows XP 批处理脚本)

    java - 如何使用 java.time 将带有可选时间的日期时间输入字符串转换为 UNIX 时间

    javascript 检索日期,例如 Windows 托盘中的用户本地日期

    php - php中的智能差异

    java - 在 Java 中使用 System.nanoTime() 时,为什么我应该使用 t1 - t0 < 0,而不是 t1 < t0

    ruby-on-rails-3 - Rails 3.0.7 和 Mongodb 集成

    javascript - 使用 !== 运算符比较从下拉列表中获取的字符串 - Javascript

    ruby-on-rails - Bootstrap CSS 在我的 Rails 应用程序中的什么位置?