以人类可读的格式显示持续时间,例如"X小时,Y分钟"

pat*_*ick 3 ruby ruby-on-rails intervals

我正在使用Rails 4,Ruby 2.1和PostgreSQL.

我有一个名为"duration"的数据库字段,它是一种间隔数据类型.

在提取此列中的数据时,它将以hh:mm:ss的格式返回,例如01:30:00.

我试图找出一种方法来显示:1小时30分钟

其他例子:02:00:00到2小时02:15:00到2小时,15分02:01:00到2小时,1分钟

任何建议表示赞赏

its*_*lay 7

只需使用duration+inspect

seconds = 86400 + 3600 + 15
ActiveSupport::Duration.build(seconds).inspect
=> "1 day, 1 hour, and 15.0 seconds"
Run Code Online (Sandbox Code Playgroud)

或者它可以稍微定制

ActiveSupport::Duration.build(seconds).parts.map do |key, value|
  [value.to_i, key].join 
end.join(' ')
=> "1days 1hours 15seconds"
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

你可以得到秒

1.day.to_i
=> 86400
Run Code Online (Sandbox Code Playgroud)

时间只能解析为ISO8601格式

ActiveSupport::Duration.parse("PT2H15M").inspect
=> "2 hours and 15 minutes"
Run Code Online (Sandbox Code Playgroud)


spi*_*ann 6

我会从这样的事情开始:

def duration_of_interval_in_words(interval)
  hours, minutes, seconds = interval.split(':').map(&:to_i)

  [].tap do |parts|
    parts << "#{hours} hour".pluralize(hours)       unless hours.zero?
    parts << "#{minutes} minute".pluralize(minutes) unless minutes.zero?
    parts << "#{seconds} hour".pluralize(seconds)   unless seconds.zero?
  end.join(', ')
end

duration_of_interval_in_words('02:00:00')
# => '2 hours'

duration_of_interval_in_words('02:01:00')
# => '2 hours, 1 minute'

duration_of_interval_in_words('02:15:00')
# => '2 hours, 15 minutes'
Run Code Online (Sandbox Code Playgroud)