ruby - 如何计算红宝石的相对时间?
问题描述
如何在红宝石中计算秒、分钟、天、月和年的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
如何在红宝石中实现这一点?请帮忙
解决方案
使用 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,但似乎都没有得到很好的维护。买者自负,您的里程可能会有所不同。
也可以看看
推荐阅读
- c++ - 事件框中图像的文件名
- c++ - 为什么在初始化 SDL 之前在 SDL 中声明一个指针?
- php - Laravel 文件存储:如何存储(解码)base64 图像?
- javascript - Phaser 2.8.1 如何从屏幕的任意位置拖动精灵?
- mysql - 表中的 MySQL 复杂连接
- .net - Outlook中的ActivateTab如何
- javascript - Laravel flash 消息无法使用关闭按钮关闭,并且在一段时间内无法自行关闭
- apache - mod_rewrite 参数作为目录并维护相对 url
- docker - 是否可以将公共 docker 镜像存储在私有 docker 注册表中
- spring-boot - Spring-Boot Embedded Tomcat - 生成 localhost.log 和 cataline.out 文件