2014-10-30 116 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"