如何将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