Railsで相対時間をどのように使用しますか?


220

私はRailsアプリケーションを書いていますが、相対時間を実行する方法を見つけることができないようです。つまり、特定のTimeクラスを指定すると、「30秒前」または「2日前」、または1か月より長い場合に計算できます。 「2008年9月1日」など


1
「計算する」は間違った言葉のようですが、「出力する」という意味ですか?
lulalala

回答:


366

ActiveSupportからtime_ago_in_wordsメソッド(またはdistance_of_time_in_words)を探しているようです。次のように呼び出します。

<%= time_ago_in_words(timestamp) %>

4
これをirbで実行する方法についてのルビー初心者のためのヒント?私は実行します: 'active_support'を必要とし、次に 'time_ago_in_words(Time.now)'を試行しますが、関数が見つかりません。
cboettig 2012

2
@cboettigこれはの一部でActiveSupportはなく、で定義されていActionView::Helpers::DateHelperます。
Michael Kohl

19
Railsコンソールを使用している場合は、「active_support」を要求する必要はありません。helperこれらのメソッドを呼び出してアクセスできるコンソールメソッドが呼び出されます。 helper.time_ago_in_words(timestamp)
Matt Polito、2012年

2
ただfyi、これをirbまたは単純なRubyで実行したい場合は、require 'active_support/core_ext' 次のことを実行してください。最初に、次に、使用するための準備が整い 7.days.agoました。
likethesky 2013

1
すごい!いくつかのサンプルコードを期待してここに来て、これを見つけました。ルビーとレールが大好きです
Marcelo Biffara

53

私はこれを書きましたが、言及されている既存のメソッドをチェックして、より優れているかどうかを確認する必要があります。

module PrettyDate
  def to_pretty
    a = (Time.now-self).to_i

    case a
      when 0 then 'just now'
      when 1 then 'a second ago'
      when 2..59 then a.to_s+' seconds ago' 
      when 60..119 then 'a minute ago' #120 = 2 minutes
      when 120..3540 then (a/60).to_i.to_s+' minutes ago'
      when 3541..7100 then 'an hour ago' # 3600 = 1 hour
      when 7101..82800 then ((a+99)/3600).to_i.to_s+' hours ago' 
      when 82801..172000 then 'a day ago' # 86400 = 1 day
      when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+' days ago'
      when 518400..1036800 then 'a week ago'
      else ((a+180000)/(60*60*24*7)).to_i.to_s+' weeks ago'
    end
  end
end

Time.send :include, PrettyDate

1
ええと、私は最初のルビーを読みました、そしてルビーはそのままではActiveSupportを持っていません。だからこの投稿はもっとルビーだと思います。ただし、実際の質問では、レールについての言及があります。
Jonke、

RailsはWebフレームワークであり、基盤となる言語はRubyです。したがって、railsの質問でルビコードを取得するのは正常です。標準のルビにActiveRecordが含まれていない場合でも、「gem install activerecord」コマンドだけでサポートされます。
MickaelFM 2009年

7
の下returncaseステートメント内に最後の行を入れて、elseすべてのを削除できreturnます。
佐和

2
なぜそこにあるの+99 +800 +180000か誰かが言うことができますか?
Gaurav Shah、2012

+99「1時間前」の終わりは7100で終わり、2時間より100秒短いためです。同様に、+ 2000は、172000が2日(172800秒)の800秒不足しているためです。
フレッド

22

Andrew Marshallがtime_ago_in_words を使用するためのソリューションを明確にするため
(Rails 3.0およびRails 4.0の場合)

あなたがビューにいる場合

<%= time_ago_in_words(Date.today - 1) %>

コントローラにいる場合

include ActionView::Helpers::DateHelper
def index
  @sexy_date = time_ago_in_words(Date.today - 1)
end

コントローラーには、デフォルトでインポートされるモジュールActionView :: Helpers :: DateHelperがありません。

注意ヘルパーをコントローラーにインポートするのは「レールの道」ではありません。ヘルパーはビューを支援するためのものです。time_ago_in_wordsの方法があることが決定されたビュー内のエンティティMVCのトライアド。(私は同意しませんが、ローマにいるとき...)


20

どうですか

30.seconds.ago
2.days.ago

または、あなたが狙っていた他の何か?


19
これは、質問の内容とは逆です。
xaxxon、2011年

12

算術演算子を使用して、相対時間を計算できます。

Time.now - 2.days 

2日前に差し上げます。


10
2.days.agoについてご存知ですか?
webmat 2008年

2
`Time.now + 2.days 'の簡単な方法はありますか?
Stefan

23
@NixNinja:2.days.sinceまたは2.days.from_now
ブライアンドノヴァン、

5
これは、質問の内容とは逆です。time_ago_in_wordsは質問に対する答えです。
xaxxon

本当にありがとうございます。
Jigar Bhatt 2015

10

このようなものが機能します。

def relative_time(start_time)
  diff_seconds = Time.now - start_time
  case diff_seconds
    when 0 .. 59
      puts "#{diff_seconds} seconds ago"
    when 60 .. (3600-1)
      puts "#{diff_seconds/60} minutes ago"
    when 3600 .. (3600*24-1)
      puts "#{diff_seconds/3600} hours ago"
    when (3600*24) .. (3600*24*30) 
      puts "#{diff_seconds/(3600*24)} days ago"
    else
      puts start_time.strftime("%m/%d/%Y")
  end
end

11
これは、本質的にdistance_of_time_in_wordsヘルパーの再実装したものです:api.rubyonrails.com/classes/ActionView/Helpers/...
グラントハッチンス

2
つまり、これを使用するべきではなく、組み込みを使用する必要があります
xaxxon '13年

これは私にはまったく問題ないようです。残りの文字列をカスタマイズできます。つまり、「3秒前」vs「3秒前」
raidfive

#{diff_seconds/360}する必要があります#{diff_seconds/3600}。編集しました。
Femaref

7

ここでのほとんどの答えはtime_ago_in_wordsを示唆しているので

代わりに:

<%= time_ago_in_words(comment.created_at) %>

Railsでは、以下を優先します。

<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
  <%= comment.created_at.to_s %>
</abbr>

jQueryライブラリhttp://timeago.yarp.com/とともに、コード:

$("abbr.timeago").timeago();

主な利点:キャッシング

http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/


1
実際にはtime_ago_in_words、時間S
23tux

6

ここでインスタンスメソッドを見てください。

http://apidock.com/rails/Time

これには、昨日、明日、begining_of_week、前などの便利なメソッドがあります。

例:

Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month


1

Railsアプリケーションを構築している場合は、

Time.zone.now
Time.zone.today
Time.zone.yesterday

これにより、Railsアプリケーションを構成したタイムゾーンの時刻または日付が表示されます。

たとえば、UTCを使用するようにアプリケーションを構成すると、 Time.zone.nowと、常にUTC時間になります(たとえば、英国の夏時間の変更の影響を受けません)。

相対時間の計算は簡単です。

Time.zone.now - 10.minute
Time.zone.today.days_ago(5)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.