我正在努力为“铁路”制作一个“更好”的distance_of_time_in_words
,到目前为止,我有这个:http://github.com/radar/dotiw。
然而,正如规格所示,目前它在几个月+几年内窒息。我完全失败了!帮助
Pax添加的代码,所以没有人必须搜索github:
module ActionView
module Helpers
module DateHelper
def distance_of_time_in_words_hash(from_time, to_time)
output = HashWithIndifferentAccess.new
from_time = from_time.to_time if from_time.respond_to?(:to_time)
to_time = to_time.to_time if to_time.respond_to?(:to_time)
distance = from_time - to_time
# Get a positive number.
distance *= -1 if distance < 0
while distance > 0
if distance > 100000000000000
elsif distance >= 31449600
output[I18n.t(:years, :default => "years")], distance =
distance.divmod(31449600)
elsif distance >= 2419200
output[I18n.t(:months, :default => "months")], distance =
distance.divmod(2419200)
elsif distance >= 604800
output[I18n.t(:weeks, :default => "weeks")], distance =
distance.divmod(604800)
elsif distance >= 86400
output[I18n.t(:days, :default => "days")], distance =
distance.divmod(86400)
elsif distance >= 3600
output[I18n.t(:hours, :default => "hours")], distance =
distance.divmod(3600)
elsif distance >= 60
output[I18n.t(:minutes, :default => "minutes")], distance =
distance.divmod(60)
else
output[I18n.t(:seconds, :default => "seconds")] = distance.to_i
distance = 0
end
end
output
end
def distance_of_time_in_words(from_time, to_time, include_seconds = false,
options = {}, output_options = {})
hash = distance_of_time_in_words_hash(from_time, to_time)
hash.delete(:seconds) if !include_seconds
# Remove all the values that are nil.
time_measurements = [
I18n.t(:years, :default => "years"),
I18n.t(:months, :default => "months"),
I18n.t(:weeks, :default => "weeks"),
I18n.t(:days, :default => "days"),
I18n.t(:hours, :default => "hours"),
I18n.t(:minutes, :default => "minutes"),
I18n.t(:seconds, :default => "seconds")].delete_if do |key|
hash[key].nil?
end
output = []
time_measurements.each do |key|
name = hash[key] > 1 ? key : key.singularize
output += ["#{hash[key]} #{name}"]
end
output.to_sentence(output_options)
end
end
end
end
答案 0 :(得分:2)
我们也完全失败了。也许你可以通过以下方式让我们的更容易生活:
那么也许我们能够做得更好。
我直接注意到的一件事:除了二月之外的任何一个月都有不 2,419,200秒(然后仅在非闰年)。同样,没有一年有364天。
我认为您需要重新考虑如何计算间隔。
假设您的“单词”版本的持续时间可以处理一点不准确,至少应该使用这些数字的平均值(考虑到一年是365.2425天,应该足够接近您的目的):
答案 1 :(得分:2)
看起来你正试图在所有适用的单位(即“2年,4个月,7天”而不是“2年”Rails'distance_of_time_in_words
给出的)中获得时差。 ?
如果是这样,请查看In Rails, display time between two dates in English,另一个关于显示时差的问题。我在那里的答案应该为你似乎想要做的事情提供一个良好的起点,并且将方法扩展到包括小时,分钟和秒都不难。