【问题标题】:Why doesn't `config.time_zone` seem to do anything?为什么`config.time_zone`似乎没有做任何事情?
【发布时间】:2023-04-06 16:44:01
【问题描述】:

application.rb 中,它说:

将 Time.zone 默认设置为指定区域并制作 Active Record 自动转换到该区域。 运行“rake -D time”以获得查找时区名称的任务列表。 默认为 UTC。

但设置 config.time_zone = 'Central Time (US & Canada)'config.time_zone = 'Eastern Time (US & Canada)' 没有效果 - 模型中的 created_at 字段仍以 UTC 格式保存。

根据this railsforum answer

config.time_zone 只是让 Rails 知道 您的服务器设置为此 时区,所以当它写入日期时 它可以正确转换的数据库 它到 UTC。

如果这是真的,那么为什么当我的系统时间是 Pacific Time (US & Canada)config.time_zone = 'Central Time (US & Canada)'config.time_zone = 'Eastern Time (US & Canada)' 时,created_at 时间是正确的 UTC?应该不会错吧?!

因为,如果 PST 时间是晚上 8 点,那么 EST 是晚上 11 点,UTC 是凌晨 4 点。 假设 Rails 执行Time.now,那就是晚上 8 点。我们告诉 Rails 服务器在 EST 中。因此,就 Rails 而言,晚上 8 点将是美国东部标准时间,然后 UTC 将是世界标准时间上午 5 点,这是不正确的(因为实际时间是太平洋标准时间晚上 8 点/美国东部标准时间晚上 11 点,即世界标准时间上午 4 点)

这是怎么回事?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    以下是可能对您有所帮助的概念和内容列表:

    config.time_zone 没有设置“服务器时间”,通常由您的操作系统控制。

    Rails 始终将您的日期以 UTC 格式存储在数据库中(除非您更改其他设置)。

    Time.now 返回您的计算机在您的时区中的本地时间,它还包括与您的操作系统的本地时区偏移量,这意味着 Ruby 和 Rails 知道如何将本地时间转换为 UTC。您可以直接使用irb 尝试此操作,因此不会加载任何 Rails 库:

    ctcherry$ irb
    >> Time.now
    => Mon Feb 21 20:53:14 -0800 2011
    >> 
    

    如果设置了config.time_zoneTime.zone,假设为EST,Rails 期望如果您设置一个日期时间属性,您的意思是该时间和日期位于指定的时区,在本例中为EST。这就是为什么您将 Time.zone 设置为您的最终用户时区,这样他们就可以使用他们的本地时间和日期,您可以将它们直接传递到您的 ActiveRecord 模型中,Rails 可以将其转换为 UTC 以存储在数据库中。

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      您需要使用in_time_zone(即Time.now.in_time_zone)来获取UTC以外的其他信息。

      【讨论】:

      • 可能无关,但这解决了我遇到的问题哈哈,谢谢!
      • 你也可以使用Time.zone.now
      • 或 Time.current。同样令人困惑的是, Date.current 尊重时区设置,而 Date.today 由您的系统时钟确定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2019-11-26
      • 2019-12-08
      • 2020-12-21
      相关资源
      最近更新 更多