2014-10-30 38 views
0

目前我使用如下:distance_of_time_in_words,更智能的格式?

distance_of_time_in_words(tweet.created_at, Time.now + 30.minutes, include_seconds: false) 

這在大多數的情況很好,但我想一定異常被不同的格式,和文檔是相當混亂的這個場景。 (我在這裏也找不到任何關於它的任何問題)

作爲一個例子,目前該函數在1天過去之前將時間轉換爲此值。

5 hours and 17 minutes ago 

我用它來發布微博和時間,如

Tweeted 4 days, 8 hours, and 3 minutes 

看起來有點長篇大論和不必要的限制。

理想我會想是能夠顯示:

less than a minute = the number of seconds ago 

less than 1 hour = the amount of minutes 

less than a day = the amount of hours 

more than a day = the number of days 

是否有這樣做的一種方式?

+0

你用什麼版本的Rails的? – spickermann 2014-10-30 02:19:45

回答

1

也許你想使用distance_of_time_in_words幫手:

0 <-> 29 secs         # => less than a minute 
30 secs <-> 1 min, 29 secs      # => 1 minute 
1 min, 30 secs <-> 44 mins, 29 secs   # => [2..44] minutes 
44 mins, 30 secs <-> 89 mins, 29 secs   # => about 1 hour 
89 mins, 30 secs <-> 23 hrs, 59 mins, 29 secs # => about [2..24] hours 
and so on... 

您可以使用該助手只用一個參數。像這樣在你看來事情應該做的工作:

Tweeted <%= time_ago_in_words(tweet.created_at) ago 

假設tweet.created_at是大約29小時前,將渲染爲:

Tweeted 1 day ago 

見:http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words

1

distance_of_time_in_words輸出(其只是time_ago_in_words的別名)應該看起來像這樣:

0 <-> 29 secs                # => less than a minute 
30 secs <-> 1 min, 29 secs            # => 1 minute 
1 min, 30 secs <-> 44 mins, 29 secs          # => [2..44] minutes 
44 mins, 30 secs <-> 89 mins, 29 secs          # => about 1 hour 
89 mins, 30 secs <-> 23 hrs, 59 mins, 29 secs        # => about [2..24] hours 
23 hrs, 59 mins, 30 secs <-> 41 hrs, 59 mins, 29 secs      # => 1 day 
41 hrs, 59 mins, 30 secs <-> 29 days, 23 hrs, 59 mins, 29 secs   # => [2..29] days 
29 days, 23 hrs, 59 mins, 30 secs <-> 44 days, 23 hrs, 59 mins, 29 secs # => about 1 month 
44 days, 23 hrs, 59 mins, 30 secs <-> 59 days, 23 hrs, 59 mins, 29 secs # => about 2 months 
59 days, 23 hrs, 59 mins, 30 secs <-> 1 yr minus 1 sec     # => [2..12] months 
1 yr <-> 1 yr, 3 months             # => about 1 year 
1 yr, 3 months <-> 1 yr, 9 months           # => over 1 year 
1 yr, 9 months <-> 2 yr minus 1 sec          # => almost 2 years 
2 yrs <-> max time or date            # => (same rules as 1 yr) 

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words

這看起來像你想要的。必須重寫distance_of_time_in_words?我不知道爲什麼會有這樣做,但似乎是這樣。

1

這是一個非Rails解決方案,儘管看起來你最好使用Rails的distance_of_time_in_words幫手。通過文檔看,後者似乎提供了巨大的靈活性。

require 'time' 

SECS_PER_MIN = 60 
SECS_PER_HOUR = 60 * SECS_PER_MIN 
SECS_PER_DAY = 24 * SECS_PER_HOUR 
SECS_PER_WEEK = 7 * SECS_PER_DAY 
SECS_PER_YEAR = 365 * SECS_PER_DAY 
SECS_PER_CENT = 100 * SECS_PER_YEAR 
SECS_PER_MLNM = 10 * SECS_PER_CENT 
SECS_PER_EON = 1_000_000 * SECS_PER_MLNM 

def message(secs) 
    case secs 
    when (0...SECS_PER_MIN) 
    "#{secs} seconds" 
    when (SECS_PER_MIN...SECS_PER_HOUR) 
    "#{secs/SECS_PER_MIN} minutes" 
    when (SECS_PER_HOUR...SECS_PER_DAY) 
    "#{secs/SECS_PER_HOUR} hours" 
    when (SECS_PER_DAY...SECS_PER_WEEK) 
    "#{secs/SECS_PER_DAY} days" 
    when (SECS_PER_WEEK...SECS_PER_YEAR) 
    "#{secs/SECS_PER_WEEK} weeks" 
    when (SECS_PER_YEAR...SECS_PER_CENT) 
     "#{secs/SECS_PER_YEAR} years" 
    when (SECS_PER_CENT...SECS_PER_MLNM) 
    "#{secs/SECS_PER_CENT} centuries" 
    when (SECS_PER_MLNM...SECS_PER_EON) 
    "#{secs/SECS_PER_MLNM} millenia" 
    else 
    "#{secs/SECS_PER_EON} eons" 
    end << " ago" 
end 

你會調用消息是這樣的:

message(Time.now-tweet_time) 

讓我們試試吧。

message(10)      #=> "10 seconds ago" 
message(1_000)     #=> "16 minutes ago" 
message(20_000)     #=> "5 hours ago" 
message(300_000)     #=> "3 days ago" 
message(10_000_000)    #=> "16 weeks ago" 
message(1_000_000_000)   #=> "31 years ago" 
message(25_000_000_000)   #=> "7 centuries ago" 
message(1_300_000_000_000)  #=> "41 millenia ago" 
message(100_000_000_000_000_000) #=> "3 eons ago" 

您可以通過改變,例如美化它,

when (SECS_PER_DAY...SECS_PER_WEEK) 
    "#{secs/SECS_PER_DAY} days" 

when (SECS_PER_DAY...SECS_PER_WEEK) 
    n = secs/SECS_PER_DAY 
    n == 1 ? "1 day" : "#{n} days"