1

我正在寻找可以帮助我格式化时间助手的助手类/方法/宝石。传入 Time.now 实例后,我正在查看的输出类似于以下内容:

"1 minute ago" 
"2 minutes ago"
"1 hour ago"
"2 hours ago"
"1 day ago"
"2 days ago"
"over a year ago"

我开始写这样的东西,但这将是漫长而痛苦的,我觉得这样的东西必须存在。唯一的问题是我需要它来使用我自己的措辞,所以需要一些带有格式化程序的东西。

 def time_ago_to_str(timestamp)
    minutes = (((Time.now.to_i - timestamp).abs)/60).round
    return nil if minutes < 0
    Rails.logger.debug("minutes #{minutes}")

    return "#{minutes} minute ago" if minutes == 1
    return "#{minutes} minutes ago" if minutes < 60
    # crap load more return statements to follow?
  end
4

1 回答 1

8

这样的助手已经存在并且内置在 Rails 中:

http://apidock.com/rails/ActionView/Helpers/DateHelper/time_ago_in_words

time_ago_in_words(5.days.ago)
=> "5 days"

编辑:

如果您想自定义措辞,您可以创建自定义I18n语言环境,例如,我在以下位置创建了一个名为 time_ago 的语言环境config/locales/time_ago.yml

time_ago:
  datetime:
     distance_in_words:
       half_a_minute: "half a minute"
       less_than_x_seconds:
         one:   "less than 1 second"
         other: "less than %{count} seconds"
       x_seconds:
         one:   "1 second"
         other: "%{count} seconds"
       less_than_x_minutes:
         one:   "less than a minute"
         other: "less than %{count} minutes"
       x_minutes:
         one:   "1 min"
         other: "%{count} mins"
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
       about_x_months:
         one:   "about 1 month"
         other: "about %{count} months"
       x_months:
         one:   "1 month"
         other: "%{count} months"
       about_x_years:
         one:   "about 1 year"
         other: "about %{count} years"
       over_x_years:
         one:   "over 1 year"
         other: "over %{count} years"
       almost_x_years:
         one:   "almost 1 year"
         other: "almost %{count} years"

现在,您可以使用以下语言环境distance_of_time_in_words

# distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
distance_of_time_in_words(5.minutes.ago, Time.now, true, {:locale => "time_ago"})
 => "5 mins" 

您当然可以将其添加到config/locales/en.yml应用程序范围内并完全覆盖它们,您可以time_ago_in_words如上所述调用!

于 2012-05-07T21:35:24.393 回答