更精确的时间间隔描述

13

distance_of_time_in_words 很不错,但有时候不够详细。

我需要一个函数能够以确切的时间距离用词来报告。例如,从早上7:50到早上10:10应该是“2小时20分钟”,而不是类似于 distance_of_time_in_words 所做的 "大约2小时" 或者其他的类似说法。

我的使用场景是报告火车时刻表,特别是给出一趟火车需要多长时间。


更新的链接:https://github.com/radar/dotiw,实际上效果更好。 - Tom Lehman
2个回答

3
def distance_of_time_in_hours_and_minutes(from_time, to_time)
  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_in_hours   = (((to_time - from_time).abs) / 3600).floor
  distance_in_minutes = ((((to_time - from_time).abs) % 3600) / 60).round

  difference_in_words = ''

  difference_in_words << "#{distance_in_hours} #{distance_in_hours > 1 ? 'hours' : 'hour' } and " if distance_in_hours > 0
  difference_in_words << "#{distance_in_minutes} #{distance_in_minutes == 1 ? 'minute' : 'minutes' }"
end

1
我会将以下代码行更改为:distance_in_hours = (((to_time - from_time).abs) / 3600).to_iround方法会四舍五入,使得1.5小时看起来像是2小时30分钟。 - theschmitzer
我建议使用(((to_time - from_time).abs) / 3600).floor而不是(((to_time - from_time).abs) / 3600).round,因为有时候在时间差为1小时50分钟时会显示"2小时50分钟"。 - Jakub Kopyś

2

上述代码让我的Rubymine感到困惑...而且我不确定它是否正确。我将其重建如下:


def distance_of_time_in_hours_and_minutes(from_time, to_time)
  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)
  dist = to_time - from_time
  minutes = (dist.abs / 60).round
  hours = minutes / 60
  minutes = minutes - (hours * 60)

  words = dist <= 0 ? '' : '-'

  words << "#{hours} #{hours > 1 ? 'hours' : 'hour' } and " if hours > 0
  words << "#{minutes} #{minutes == 1 ? 'minute' : 'minutes' }"
end

Here's some Rspec for the above:


describe "Distance of Time in Hours and Minutes" do
  before do
    @time1 = Time.utc(2010,"sep",7,14,15,3)
    @time2 = @time1 + 28
    @time3 = @time1 + 30
    @time4 = @time1 + 60
    @time5 = @time1 + 60*60
    @time6 = @time1 + 60*60 + 60
    @time7 = @time1 + 60*60 + 5*60
  end

  it "calculates time differences properly" do
    distance_of_time_in_hours_and_minutes(@time1, @time1).should == "0 minutes"
    distance_of_time_in_hours_and_minutes(@time1, @time2).should == "0 minutes"
    distance_of_time_in_hours_and_minutes(@time1, @time3).should == "1 minute"
    distance_of_time_in_hours_and_minutes(@time1, @time4).should == "1 minute"
    distance_of_time_in_hours_and_minutes(@time1, @time5).should == "1 hour and 0 minutes"
    distance_of_time_in_hours_and_minutes(@time1, @time6).should == "1 hour and 1 minute"
    distance_of_time_in_hours_and_minutes(@time1, @time7).should == "1 hour and 5 minutes"
    distance_of_time_in_hours_and_minutes(@time7, @time1).should == "-1 hour and 5 minutes"
    distance_of_time_in_hours_and_minutes(@time3, @time1).should == "-1 minute"
  end
end

请注意,在我的编程环境中,我已经在每次调用distance_of_time_in_miles时添加了helper,以避免出现NoMethodError错误--例如,请参见http://old.nabble.com/How-to-spec-a-Rails-helper-method-td20660744.html

1
这行代码 "words = dist <= 0 ? '' : '-'" 不是反了吗?如果dist为正数,你返回减号,而实际上应该在dist为负数时返回减号。 - Max Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接