Rails:格式化日期:今天为"HH:MM",昨天为"昨天",上周其他日期为"工作日","DD.MM." 其他一切

Jos*_*eim 3 ruby ruby-on-rails date

我确信已经有一个解决方案可以满足我的需求,但我想我不知道该搜索什么.任何指向正确的方向?

我在考虑像Rails这样的东西distance_of_time_in_words_to_now.

谢谢.

Mur*_*foX 9

我相信你可以使用这样的助手.

def custom_format(date)
  if date == Date.today
    "Today"
  elsif date == Date.yesterday
    "Yesterday"
  elsif (date > Date.today - 7) && (date < Date.yesterday)
    date.strftime("%A")
  else
    date.strftime("%B %-d")
  end
end
Run Code Online (Sandbox Code Playgroud)

没有测试代码,它只是指向你的问题的指针.


Len*_*yes 5

创建一个文件 .../config/initializers/time_format.rb 并将以下代码放入其中:

Time::DATE_FORMATS[:humanized_ago]  = ->(time) do
  st = Time.now.beginning_of_day
  nd = Time.now.end_of_day

  case 
  when time.between?(st + 1.day, nd + 1.day)
    "Tomorrow #{time.strftime('%H:%M')}"
  when time.between?(st, nd)
    "Today #{time.strftime('%H:%M')}"
  when time.between?(st - 1.day, nd - 1.day)
    "Yesterday #{time.strftime('%H:%M')}"
  when time.between?(st - 6.day, nd - 2.day)
    time.strftime('%a %H:%M')
  else 
    time.strftime('%y-%b-%d %H:%M')
  end
end
Run Code Online (Sandbox Code Playgroud)

在 Rails Time 对象上,调用 function time.to_s(:humanized_ago)。如果你不喜欢符号“:humanized_ago”,就在time_format.rb的第一行中随意更改它。”如果你想要其他格式,你可以自己弄清楚。

出于某种原因,我以我的方式编写了比较。我找不到使用 Ruby 内置范围来测试时间的方法,并且您需要能够测试不包括终点的时间间隔。