我如何使用Time in Rails?

时间:2009-07-15 18:36:24

标签: ruby-on-rails time format activesupport

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

对于Time.new和ActiveSupport 1.second.ago,我似乎也遇到了截然不同的时间。无论如何,有没有人对使用Time in Rails有任何质量建议?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在初始化程序的某处,定义要使用的格式。

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"

Calling Time#to_s使用:default格式,或者你可以传递你喜欢使用的格式的名称:my_special_format。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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