1

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

Time.new 与 ActiveSupport 1.second.ago 的时间似乎也大不相同。无论如何,关于在 Rails 中使用 Time,是否有人有任何质量建议?

4

5 回答 5

1

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

于 2009-07-15T19:21:44.013 回答
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"

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

您可以在此处查看格式化 Time 对象的各种选项。

于 2009-07-15T23:40:50.103 回答
0

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

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

<% javascript_tag do -%>
  var today = new Date();
  $("trynow").href = "<%= new_invitation_path %>?today=" + today.toLocaleString();
<% end -%>
于 2009-07-16T07:44:47.183 回答
0

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

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

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

于 2009-12-07T06:32:19.733 回答
0

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

CoreExtensions::Time::Conversions::DATE_FORMATS.merge! :my_complex_format => lambda {|time|
   # your code goes here
}
于 2011-01-04T20:38:57.447 回答