如何将270921sec转换为天+小时+分钟+秒? (ruby)

我有几秒钟。 我们来说说270921.我怎样才能显示这个数字是xx天,yy小时,zz分钟,ww秒?

这可以使用divmod简洁地divmod

 t = 270921 mm, ss = t.divmod(60) #=> [4515, 21] hh, mm = mm.divmod(60) #=> [75, 15] dd, hh = hh.divmod(24) #=> [3, 3] puts "%d days, %d hours, %d minutes and %d seconds" % [dd, hh, mm, ss] #=> 3 days, 3 hours, 15 minutes and 21 seconds 

你可以通过collect或者inject来获得更多的创意,但是当核心逻辑是三行时,这可能是矫枉过正的。

我希望能有比使用divmod更简单的方法,但这是我发现的最干,最可重用的方法:

 def seconds_to_units(seconds) '%d days, %d hours, %d minutes, %d seconds' % # the .reverse lets us put the larger units first for readability [24,60,60].reverse.inject([seconds]) {|result, unitsize| result[0,0] = result.shift.divmod(unitsize) result } end 

该方法很容易通过更改格式string和第一个内联数组(即[24,60,60])进行调整。

增强版本

 class TieredUnitFormatter # if you set this, '%d' must appear as many times as there are units attr_accessor :format_string def initialize(unit_names=%w(days hours minutes seconds), conversion_factors=[24, 60, 60]) @unit_names = unit_names @factors = conversion_factors @format_string = unit_names.map {|name| "%d #{name}" }.join(', ') # the .reverse helps us iterate more effectively @reversed_factors = @factors.reverse end # eg seconds def format(smallest_unit_amount) parts = split(smallest_unit_amount) @format_string % parts end def split(smallest_unit_amount) # go from smallest to largest unit @reversed_factors.inject([smallest_unit_amount]) {|result, unitsize| # Remove the most significant item (left side), convert it, then # add the 2-element array to the left side of the result. result[0,0] = result.shift.divmod(unitsize) result } end end 

例子:

 fmt = TieredUnitFormatter.new fmt.format(270921) # => "3 days, 3 hours, 15 minutes, 21 seconds" fmt = TieredUnitFormatter.new(%w(minutes seconds), [60]) fmt.format(5454) # => "90 minutes, 54 seconds" fmt.format_string = '%d:%d' fmt.format(5454) # => "90:54" 

请注意, format_string不会让你改变零件的顺序(它总是最重要的值至less)。 为了更细粒度的控制,你可以使用split和自己操纵值。

需要rest一下。 打高尔夫:

 s = 270921 dhms = [60,60,24].reduce([s]) { |m,o| m.unshift(m.shift.divmod(o)).flatten } # => [3, 3, 15, 21] 

如果你使用的是Rails,如果你不需要精度的话,有一个简单的方法:

 time_ago_in_words 270921.seconds.from_now # => 3 days 

Rails有个帮手,可以用文字转换时间。 你可以看看它的实现: distance_of_time_in_words

你可以使用我find的最简单的方法来解决这个问题:

  def formatted_duration total_seconds hours = total_seconds / (60 * 60) minutes = (total_seconds / 60) % 60 seconds = total_seconds % 60 "#{ hours } h #{ minutes } m #{ seconds } s" end 

您随时可以根据需要调整返回的值。

 2.2.2 :062 > formatted_duration 3661 => "1 h 1 m 1 s" 

我刚开始写ruby。 我猜这只是1.9.3

 def dateBeautify(t) cute_date=Array.new tables=[ ["day", 24*60*60], ["hour", 60*60], ["minute", 60], ["sec", 1] ] tables.each do |unit, value| o = t.divmod(value) p_unit = o[0] > 1 ? unit.pluralize : unit cute_date.push("#{o[0]} #{unit}") unless o[0] == 0 t = o[1] end return cute_date.join(', ') end