首页 > 解决方案 > 如何计算红宝石的相对时间?

问题描述

如何在红宝石中计算秒、分钟、天、月和年的relative_time?

Given a DateTime object, implement relative time
d = DateTime.now
d.relative_time # few seconds ago

Possible outputs
# few seconds ago
# few minutes ago - till 3 minutes
# x minutes ago (here x starts from 3 till 59)
# x hours ago (x starts from 1 - 24) and so on for the below outputs
# x days ago
# x weeks ago
# x months ago
# x years ago

如何在红宝石中实现这一点?请帮忙

标签: rubydatetimerelative-time-span

解决方案


使用 GNU 日期

在 Ruby 的核心和标准库中,没有针对您想要的输出类型的便捷方法,因此您必须实现自己的逻辑。如果没有 ActiveSupport 扩展,您最好调用 GNU(而不是 BSD)日期实用程序。例如:

now       = Time.now
last_week = %x(date -d "#{now} - 1 week")

如果您将格式标志传递给 GNU date,例如+"%s", date 命令将提供日期为自纪元以来的秒数。这允许您为要比较的任何时间单位创建案例语句,例如超过 360 秒前还是不到 86,400 秒。

请参阅 GNU coreutils 定义的日期输入格式,以更全面地了解如何使用各种日期字符串选项。

使用 Rails 扩展

如果您愿意在代码中安装并需要几个 Rails 扩展,可以使用ActionView::Helpers::DateHelper#distance_of_time_in_words。例如:

require "active_support/core_ext/integer/time"
require "active_support/core_ext/numeric/time"
require "action_view"

include ActionView::Helpers::DateHelper

2.weeks.ago
#=> 2020-07-12 09:34:20.178526 -0400

distance_of_time_in_words Date.current, 1.month.ago
#=> "30 days"

sprintf "%s ago", distance_of_time_in_words(Time.now, 1.hour.ago)
#=> "about 1 hour ago"

各种#ago 方法与日期/时间计算相结合,以及对距离助手的调用将做你想做的事,但如果你想以不同的方式转换结果(例如指定您希望将大距离的输出作为几周或几个月而不是几年)。

其他宝石

当然还有其他 Ruby gem 可以提供帮助。Ruby Toolbox 显示了许多用于确定时差的 gem,但似乎都没有得到很好的维护。买者自负,您的里程可能会有所不同。

也可以看看


推荐阅读