How do you say在Ruby发表了"x分钟前"或"x小时前"或"x天前"的事情?

Ken*_*hns 4 ruby formatting time

如果我在Ruby中有一个时间变量,我怎么能说它引用了一个发生以下事件之一的事件:

"x分钟前"或"x小时前"或"x天前"

显然,如果2天前发生了什么事情,我不想说它在几分钟之前就已经发生了.

pax*_*blo 12

这是与语言无关的版本,您应该能够将其转换为任何语言:

ONE_MINUTE = 60
ONE_HOUR = 60 * ONE_MINUTE
ONE_DAY = 24 * ONE_HOUR
ONE_WEEK = 7 * ONE_DAY
ONE_MONTH = ONE_DAY * 3652425 / 120000
ONE_YEAR = ONE_DAY * 3652425 / 10000

def when(then):
    seconds_ago = now() - then

    if seconds_ago < 0:
        return "at some point in the future (???)"
    if seconds_ago == 0:
        return "now"

    if seconds_ago == 1:
        return "1 second ago"
    if seconds_ago < ONE_MINUTE:
        return str(seconds_ago) + " seconds ago"

    if seconds_ago < 2 * ONE_MINUTE:
        return "1 minute ago"
    if seconds_ago < ONE_HOUR:
        return str(seconds_ago/ONE_MINUTE) + " minutes ago"

    if seconds_ago < 2 * ONE_HOUR:
        return "1 hour ago"
    if seconds_ago < ONE_DAY:
        return str(seconds_ago/ONE_HOUR) + " hours ago"

    if seconds_ago < 2 * ONE_DAY:
        return "1 day ago"
    if seconds_ago < ONE_WEEK:
        return str(seconds_ago/ONE_DAY) + " days ago"

    if seconds_ago < 2 * ONE_WEEK:
        return "1 week ago"
    if seconds_ago < ONE_MONTH:
        return str(seconds_ago/ONE_WEEK) + " weeks ago"

    if seconds_ago < 2 * ONE_MONTH:
        return "1 month ago"
    if seconds_ago < ONE_YEAR:
        return str(seconds_ago/ONE_MONTH) + " months ago"

    if seconds_ago < 2 * ONE_YEAR:
        return "1 year ago"
    return str(seconds_ago/ONE_YEAR) + " years ago"
Run Code Online (Sandbox Code Playgroud)

需要注意的是年/月的数字均为近似值(基于平均值),但是这不应该真正的问题,因为相对误差仍然是非常低的.


Jur*_*ass 11

如果你在轨道上:

time_ago_in_words
Run Code Online (Sandbox Code Playgroud)

  • API参考:http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#M001696 (3认同)
  • 如果您没有碰巧使用Rails,请查看相关方法的源代码:http://dev.rubyonrails.org/browser/trunk/actionpack/lib/action_view/helpers/date_helper.rb?frev = 4674#L24 (2认同)