你怎么说一些在Ruby中发生的“X分钟前”或“x小时前”或“X天前”?(How do you say

2019-08-18 06:27发布

如果我在Ruby的一个时间变量,我怎么会说,它指的是发生下列之一的事件:

“X分钟前”或“x小时前”或“X天前”

显然,如果有事发生3天前,我不想说这事,例如,某某分钟前。

Answer 1:

如果您在轨道上:

time_ago_in_words


Answer 2:

下面是你应该能够转换成任何语言的语言无关的版本:

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"

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



Answer 3:

你需要做的是这样的:

tnow = Time.now
elapsed = tnow - tevent # elapsed time in seconds

if (elapsed < 60)
  puts "#{elapsed} seconds ago"
elsif (elapsed < 60*60)
  puts "#{elapsed/60} minutes ago"
end


Answer 4:

下面是一个完整的例子,如果你选择去外面全Rails的,但愿意用active_support( gem install actionview

#!/usr/bin/env ruby

require 'active_support'
require 'active_support/core_ext/object/acts_like'
require 'active_support/core_ext/time/acts_like'
require 'action_view'

require 'date'

# Avoid a deprecation warning
I18n.enforce_available_locales = false

# Add time_ago_in_words
extend ActionView::Helpers::DateHelper

[
  '2014-04-24 16:20:00',
  '2014-04-21 16:20:00',
  '2014-03-24 16:20:00',
  '2013-04-20 16:20:00',
].map {|t| DateTime.parse t}.each do |time|
  puts time_ago_in_words time
end

在写这篇文章的时候,这个输出:

about 6 hours
3 days
about 1 month
about 1 year


文章来源: How do you say something happened “x minutes ago” or “x hours ago” or “x days ago” in Ruby?