【发布时间】:2020-01-23 23:19:30
【问题描述】:
我有一种非常奇怪的感觉,即 ActiveSupport::Duration 计算的持续时间不正确。这是我拥有的代码的精髓
require 'time'
require 'active_support/duration'
require 'active_support/gem_version'
a = Time.parse('2044-11-18 01:00:00 -0600')
b = Time.parse('2045-03-05 04:00:00 -0600')
ActiveSupport::Duration.build(b - a).inspect
ActiveSupport.gem_version
这就是我得到的
[30] pry(main)> require 'time'
=> false
[31] pry(main)> require 'active_support/duration'
=> false
[32] pry(main)> require 'active_support/gem_version'
=> false
[33] pry(main)> a = Time.parse('2044-11-18 01:00:00 -0600')
=> 2044-11-18 01:00:00 -0600
[34] pry(main)> b = Time.parse('2045-03-05 04:00:00 -0600')
=> 2045-03-05 04:00:00 -0600
[35] pry(main)> ActiveSupport::Duration.build(b - a).inspect
=> "3 months, 2 weeks, 1 day, 19 hours, 32 minutes, and 42.0 seconds"
[36] pry(main)> ActiveSupport.gem_version
=> Gem::Version.new("6.0.1")
我用 PostgreSQL 交叉检查了结果
select justify_interval('2045-03-05 04:00:00 -0600'::timestamp - '2044-11-18 01:00:00 -0600'::timestamp)
并得到3 mons 17 days 03:00:00(或 107 天零 3 小时)。还有一个与 PostgreSQL 一致的web site that gives 结果(虽然网页上说 107 天是 3 个月和 15 天)。
我错过了什么吗?分钟和秒是从哪里来的?有没有更好的 Ruby/Rails 间隔计算器?
更新
distance_of_time_in_words 退货 4 个月!
更新 2 我最终得到了稍微修改的向导解决方案以生成文本
def nice_duration(seconds)
parts = duration_in_whms(seconds)
out = []
I18n.with_options(scope: 'datetime.distance_in_words') do |locale|
out.push locale.t(:x_days, count: parts[:days]) if parts.key?(:days)
out.push locale.t(:x_hours, count: parts[:hours]) if parts.key?(:hours)
out.push locale.t(:x_minutes, count: parts[:minutes]) if parts.key?(:minutes)
end
out.join ' '
end
private
def duration_in_whms(seconds)
parts_and_seconds_in_part = {:days => 86400, :hours => 3600, :minutes => 60}
result = {}
remainder = seconds
parts_and_seconds_in_part.each do |k, v|
out = (remainder / v).to_i
result[k] = out if out.positive?
remainder -= out * v
end
result.merge(seconds: remainder)
end
显然,如果没有about,Action View 的本地化就没有几个小时。所以我还必须在我的语言环境中添加相应的翻译
en:
datetime:
distance_in_words:
x_hours:
one: "1 hour"
other: "%{count} hours"
【问题讨论】:
标签: ruby-on-rails ruby activesupport