【问题标题】:How do I work with Time in Rails?如何在 Rails 中使用 Time?
【发布时间】:2010-11-11 02:43:47
【问题描述】:

我一直在努力尝试在 Rails 中使用 Time。基本上我需要将所有时间输出(核心以及 ActiveSupport)设置为服务器的本地时间 - 没有 GMT,没有 UTC 等。我看过各种与时间相关的帖子,但它们通常涉及有人需要设置它每个用户。我的几乎没有那么复杂,我只是想要在使用任何 Time 对象时保持一致性。 (我也很感激没有每 3 秒收到一次错误,告诉我我无法将 Fixnum(或其他类型)转换为字符串——它是 Ruby,去做吧!)

Time.new 与 ActiveSupport 1.second.ago 的时间似乎也大不相同。无论如何,对于在 Rails 中使用 Time 有什么好的建议吗?

【问题讨论】:

    标签: ruby-on-rails time format activesupport


    【解决方案1】:

    如果您只是希望 Time 对象保持一致,那么为什么不坚持使用 UTC?我刚刚使用脚本/控制台尝试了Time.new1.second.ago,我得到了相同的输出(给或花一秒钟来输入命令)。你做得怎么样?

    【讨论】:

    • 我很抱歉。你是对的。返回的信息是一样的。但是,在将值打印到字符串时遇到错误。转换“to_i”并再次返回变得混乱和计算错误。正如我所说,我不想要 UTC,也不想永远转换(因为我在很多地方都使用它)。我只是希望所有时间都作为本地服务器时间返回。谢谢
    【解决方案2】:

    在你的初始化器的某个地方,定义你想要使用的格式。

    ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:default => '%m/%d/%Y %H:%M')
    ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:my_special_format => '%H:%M %p')
    

    然后,当您要打印 Time 对象时,它的工作方式类似于以下示例。请注意,我的控制台中的 Time 对象已经知道我的时区。我没有在这里进行任何神奇的转换。

    >> t = Time.now
    => Wed Jul 15 18:47:33 -0500 2009
    >> t.to_s
    => "07/15/2009 18:47"
    >> t.to_s(:my_special_format)
    => "18:47 PM"
    

    调用 Time#to_s 使用 :default 格式,或者您可以像我使用 :my_special_format 一样传入您希望使用的格式的名称。

    您可以查看格式化时间对象here 的各种选项。

    【讨论】:

    • 只是给像我这样发现这个问题的其他人的快速评论。
    【解决方案3】:

    如果您不想存储每个用户时间设置,唯一的解决方案是使用 javascript 时间系统,因为它适用于用户客户端时间。例如,我有一个应用程序,每次用户尝试它时,该应用程序都会创建一些示例数据,每个数据都有一个初始日期值“今天”。第一次,它让我很困惑,因为我的主机服务器在澳大利亚,很多用户在西部,所以有时初始日期值不是“今天”,它说“昨天”,因为不同的时间区域。

    经过几天的头痛后,我终于决定只使用 javascript 时间系统并将其包含在链接中,因此当用户单击“立即尝试”链接时,它还将包含今天的日期值。

    <% javascript_tag do -%>
      var today = new Date();
      $("trynow").href = "<%= new_invitation_path %>?today=" + today.toLocaleString();
    <% end -%>
    

    【讨论】:

    • 谢谢。然而,我关心的不是让时间与人同步。我的问题是时间对象返回类似格式的显示/打印值。我不在乎人们在哪个时区。我正在处理与应用程序在同一台服务器上记录的数据,所以我只需要时间在整个服务器上保持一致——与它自己的本地数据保持一致.也就是说,我的问题是 ActiveSupport 返回 UTC 格式的时间,而 Time 返回本地格式的时间。我一直需要所有本地服务器。再次感谢。
    【解决方案4】:

    将以下内容添加到 config/environment.rb 以在 Rails 上下文中始终正确且一致地处理时间。重要的是要知道它会以 UTC 格式将您的时间存储到数据库中——但这正是您想要的——所有的转换都是自动完成的。

    config.time_zone = 'Pacific Time (US & Canada)'
    

    您可以从 Rails 根目录运行 rake time:zones:local 以获取您所在地区的有效时区字符串列表。

    【讨论】:

      【解决方案5】:

      对上面发布的 DATE_FORMAT 解决方案的快速补充。你的格式可以是一个字符串,在这种情况下,它可以通过调用 strftime 如上所述工作,但你也可以将格式定义为 lambda:

      CoreExtensions::Time::Conversions::DATE_FORMATS.merge! :my_complex_format => lambda {|time|
         # your code goes here
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 2018-12-31
        • 2015-05-22
        • 2014-07-10
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多