Ruby/Rails:将日期时间转换为自然语言(例如3/23/2012到"本周五")

Mat*_*att 6 datetime ruby-on-rails ruby-on-rails-3

是否有人知道一个gem,方法或代码片段,它会将日期时间值转换为更加人性化,而无需创建一系列规则或在视图中放置一堆逻辑?例如:如果今天是2012年3月19日,请转换:

  • 3/23/2012至"本周五"
  • 3/26/2012至"下周一"
  • 2012年3月31日至"下周末"
  • 2012年4月15日至"下个月"
  • 3/15/2012至"上周四"
  • 2011年3月1日至"去年"

基本上,我正在寻找与慢性宝石相反的东西.更类似的东西distance_of_time_in_words,但有一个扭曲.我不想从数据库中获取日期并按原样显示它们,而是在向最终用户显示时,使它们更加人性化且相关性更强.

Tom*_*son 5

这是一个小小的黑客,完全未完成和不优雅.但Ruby/Rails在日期方面非常棒,范围非常完美,如果你没有找到宝石,这样的东西会让你开始:

module HumanDate
  def date_difference_for_people (from, to)
    seconds_in_day = 24 * 60 * 60
    days_difference = ((to - from)/seconds_in_day).round
    case days_difference
      when -1
        "yesterday"
      when 0
        "today"
      when 1
        "tomorrow"
      when 2..days_left_in_week
        "this #{day_name(difference)}"
      when (days_left_in_week + 1)..(days_left_in_week + 7)
        "next week"
      when (days_left_in_week + 8)..days_left_in_month
        "later this month"
      else
        "later -- how much left to you :-)"
    end
  end

  def day_name(days_from_now)
    days_from_now.days_from_now.strftime("%A")
  end

  def days_left_in_month
    Time.now.end_of_month.day - Time.now.day
  end

  def days_left_in_week
    Time.now.end_of_week.day - Time.now.day
  end
end
Run Code Online (Sandbox Code Playgroud)