Piszę aplikację Railsową, ale nie mogę znaleźć sposobu na obliczenie czasu względnego, tzn. Jeśli otrzyma określoną klasę Time, może obliczyć „30 sekund temu” lub „2 dni temu” lub jeśli jest ona dłuższa niż miesiąc „9/1/2008” itp.
Piszę aplikację Railsową, ale nie mogę znaleźć sposobu na obliczenie czasu względnego, tzn. Jeśli otrzyma określoną klasę Time, może obliczyć „30 sekund temu” lub „2 dni temu” lub jeśli jest ona dłuższa niż miesiąc „9/1/2008” itp.
Odpowiedzi:
Wygląda na to, że szukasz time_ago_in_words
metody (lub distance_of_time_in_words
) z ActiveSupport. Nazwij to tak:
<%= time_ago_in_words(timestamp) %>
ActiveSupport
, jest zdefiniowane w ActionView::Helpers::DateHelper
.
helper
, którą można wywoływać i uzyskiwać dostęp do tych metod. helper.time_ago_in_words(timestamp)
require 'active_support/core_ext'
Najpierw, a potem wszystko gotowe do użycia 7.days.ago
i innych podobnych konstrukcji.
Napisałem to, ale muszę sprawdzić wymienione metody, aby sprawdzić, czy są lepsze.
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
return
linię w case
instrukcji else
i usunąć wszystkie return
litery.
+99
+800
+180000
?
Żeby wyjaśnić rozwiązanie Andrew Marshalla dotyczące używania time_ago_in_words
(dla Rails 3.0 i Rails 4.0)
Jeśli jesteś w widoku
<%= time_ago_in_words(Date.today - 1) %>
Jeśli jesteś kontrolerem
include ActionView::Helpers::DateHelper
def index
@sexy_date = time_ago_in_words(Date.today - 1)
end
Kontrolery nie mają modułu domyślnie importowanego ActionView :: Helpers :: DateHelper .
Uwaga: Importowanie pomocników do kontrolerów nie jest „drogą szynową”. Pomocnicy służą do pomocy w wyświetlaniu. Metoda time_ago_in_words została uznana za encję widoku w triadzie MVC . (Nie zgadzam się, ale kiedy jestem w Rzymie ...)
Możesz użyć operatorów arytmetycznych do wykonania czasu względnego.
Time.now - 2.days
Dam ci 2 dni temu.
2.days.since
lub2.days.from_now
Coś takiego działałoby.
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
#{diff_seconds/360}
powinno być #{diff_seconds/3600}
. Zredagowałem to.
Ponieważ większość odpowiedzi tutaj sugeruje time_ago_in_words .
Zamiast używać :
<%= time_ago_in_words(comment.created_at) %>
W Railsach preferuj:
<abbr class="timeago" title="<%= comment.created_at.getutc.iso8601 %>">
<%= comment.created_at.to_s %>
</abbr>
wraz z biblioteką jQuery http://timeago.yarp.com/ , z kodem:
$("abbr.timeago").timeago();
Główna zaleta: buforowanie
http://rails-bestpractices.com/posts/2012/02/10/not-use-time_ago_in_words/
time_ago_in_words
to czas S
Spójrz na metody instancji tutaj:
Ma to przydatne metody, takie jak wczoraj, jutro, początek tygodnia, temu itd.
Przykłady:
Time.now.yesterday
Time.now.ago(2.days).end_of_day
Time.now.next_month.beginning_of_month
Napisałem klejnot, który robi to dla obiektów Rails ActiveRecord. W przykładzie użyto create_at, ale będzie również działał na updated_at lub cokolwiek innego z klasą ActiveSupport :: TimeWithZone.
Wystarczy zainstalować klejnot i wywołać metodę „ładną” w instancji TimeWithZone.
Jeśli budujesz aplikację Railsową, powinieneś jej użyć
Time.zone.now
Time.zone.today
Time.zone.yesterday
Podaje godzinę lub datę w strefie czasowej, w której skonfigurowano aplikację Rails.
Na przykład jeśli skonfigurujesz aplikację do korzystania z UTC, to Time.zone.now
zawsze będzie ona w czasie UTC (na przykład zmiana brytyjskiego czasu letniego nie będzie miała na nią wpływu).
Obliczanie czasu względnego jest łatwe, np
Time.zone.now - 10.minute
Time.zone.today.days_ago(5)
Innym podejściem jest rozładowanie logiki z backendu i sprawdzenie, czy przeglądarka wykonuje zadanie za pomocą wtyczek JavaScript, takich jak:
jQuery czas temu lub jego adaptacja Rails Gem