読者です 読者をやめる 読者になる 読者になる

タイムスタンプのスマートな表示方法(Time#smart)を定義する

Ruby Rails

よく、update_atを表示するときに2008/07/19 09:28とかって
表示すると思うのですが、これは長い。スマートじゃない。
もちろんセクシーでもないです。
要点を考えると、今の時刻から1日未満だったら9:29といった感じで
時刻だけでいいし、3か月未満だったら7/15といった感じで
日付だけで良さそうだと思います。3か月以上だったら
4/12(2008)といった感じで年もついた方がいいかなと思います。
というわけで作ってみました。
以下をconfig/environment.rbに追加でもすればOKです。

class Time
  def smart(now=self.class.now)
    if (now-self).abs<86400
      sprintf("%d:%02d",self.hour,self.min)
    elsif (now-self).abs<7776000
      sprintf("%d/%02d",self.month,self.day)
    else
      sprintf("%d/%02d(%d)",self.month,self.day,self.year)
    end
  end
end

実行結果

?> Time.now.smart
=> "12:36"
>> Time.mktime(2008,8,20,9).smart
=> "9:00"
>> Time.mktime(2008,8,18).smart
=> "8/18"
>> Time.mktime(2008,4,20).smart
=> "4/20(2008)"
>> Time.mktime(2007,8,20).smart
=> "8/20(2007)"
>> Time.mktime(2008,8,25).smart
=> "8/25"
>> Time.mktime(2009,8,25).smart
=> "8/25(2009)"

これだったらビューに

<td><%=h @user.created_at.smart %></td>

みたいに書くとかなり短く表示されますよね。
古いデータは時刻まで表示される必要はないし、
最近のデータは年まで表示される必要はないんですよ。