it-swarm.com.de

Wie macht man relative Zeit in Rails?

Ich schreibe eine Rails) - Anwendung, kann aber anscheinend nicht herausfinden, wie die relative Zeit berechnet wird. Wenn also eine bestimmte Zeitklasse angegeben wird, kann sie "vor 30 Sekunden" oder "2 Tage" berechnen vor "oder wenn es länger als ein Monat ist" 9/1/2008 ", etc.

222
lol_wut

Klingt so, als suchst du das time_ago_in_words Methode (oder distance_of_time_in_words ) von ActiveSupport. Nenne es so:

<%= time_ago_in_words(timestamp) %>
363
Ben Scofield

Ich habe dies geschrieben, muss aber die vorhandenen erwähnten Methoden überprüfen, um festzustellen, ob sie besser sind.

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
51
MattW.

Nur um Andrew Marshalls Lösung für die Verwendung zu verdeutlichen time_ago_in_words
(Für Rails 3.0 und Rails 4.0)

Wenn Sie in einer Ansicht sind

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

Wenn Sie sich in einem Controller befinden

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

Auf Controllern ist das Modul ActionView :: Helpers :: DateHelper nicht standardmäßig importiert.

N.B. Es ist nicht "die Rails Möglichkeit", Hilfsprogramme in Ihre Controller zu importieren. Hilfsprogramme helfen Ansichten time_ago_in_words Methode wurde beschlossen, ein zu sein aussicht Einheit in der MVC Triade. (Ich stimme nicht zu, aber wenn in Rom ...)

22
seo

Wie wäre es mit

30.seconds.ago
2.days.ago

Oder etwas anderes, wonach du geschossen hast?

20
Honza

Sie können die arithmetischen Operatoren verwenden, um die relative Zeit zu bestimmen.

Time.now - 2.days 

Wird Ihnen vor 2 Tagen geben.

12
TonyLa

So etwas würde funktionieren.

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
9
Gordon Wilson

Da die meisten Antworten hier time_ago_in_words vorschlagen.

Anstelle von:

<%= time_ago_in_words(comment.created_at) %>

In Rails bevorzugen:

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

zusammen mit einer jQuery-Bibliothek http://timeago.yarp.com/ , mit Code:

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

Hauptvorteil: Caching

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

7
Rahul garg

Schauen Sie sich hier die Instanzmethoden an:

http://apidock.com/Rails/Time

Dies hat nützliche Methoden wie gestern, morgen, Beginn_der_Woche, vor, etc.

Beispiele:

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

Wenn Sie eine Rails - Anwendung erstellen, sollten Sie verwenden

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

Dies gibt Ihnen Zeit oder Datum in der Zeitzone an, mit der Sie Ihre Rails Anwendung konfiguriert haben.

Wenn Sie Ihre Anwendung beispielsweise für die Verwendung von UTC konfigurieren, wird Time.zone.now ist immer in UTC-Zeit (dies wird beispielsweise durch die Änderung der britischen Sommerzeit nicht beeinflusst).

Die Berechnung der relativen Zeit ist einfach, z

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

Ich habe einen Edelstein geschrieben, der dies für Rails ActiveRecord-Objekte macht. Das Beispiel verwendet created_at, aber es funktioniert auch mit updated_at oder irgendetwas mit der Klasse ActiveSupport :: TimeWithZone.

Einfach gem installieren und die 'hübsche' Methode auf Ihrer TimeWithZone-Instanz aufrufen.

https://github.com/brettshollenberger/hublot

1

Ein anderer Ansatz besteht darin, eine Logik aus dem Backend zu entladen und den Browser dazu zu bringen, die Aufgabe zu erledigen, indem er Javascript-Plugins verwendet, wie zum Beispiel:

jQuery time ago oder Rails Gem Adaption

0
The Whiz of Oz