Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 以人类可读的格式显示持续时间,例如;X小时,Y分钟”;_Ruby On Rails_Ruby_Time_Intervals_Time Format - Fatal编程技术网

Ruby on rails 以人类可读的格式显示持续时间,例如;X小时,Y分钟”;

Ruby on rails 以人类可读的格式显示持续时间,例如;X小时,Y分钟”;,ruby-on-rails,ruby,time,intervals,time-format,Ruby On Rails,Ruby,Time,Intervals,Time Format,我正在使用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分钟 我将从以下内容开始: def duration_of_interval_in_words(interval) hours, minute

我正在使用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分钟

    • 我将从以下内容开始:

      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'
      
      def duration_of_interval_(间隔)以字表示
      小时,分钟,秒=间隔。拆分(':')。映射(&:to_i)
      []点击do |零件|
      零件“2小时15分钟”
      
      我发现duration.inspect可以很好地发挥作用

      > 10.years.inspect
      => "10 years"
      
      另见 ActionView::Helpers::DateHelper时间间隔(以单词表示)(及相关)

      e、 g

      0.29秒#=>不到一分钟
      30秒1分钟,29秒=1分钟
      1分钟,30秒44分钟,29秒>[2..44]分钟
      ... 等
      


      可能不适合包含在模型验证错误中?(这是我的用例)

      您可以尝试以下方法来显示,例如:

      • 分钟到人(45)#45分钟
      • 分钟到人(120)#2小时
      • 分钟到人(75)#2.5小时
      • 分钟到人(75)#1.15小时


      翻译:

      en:
        helper:
          minutes_to_human:
            minutes:
              zero: '%{count} minute'
              one: '%{count} minute'
              other: '%{count} minutes'
            hours:
              one: '%{count} hour'
              other: '%{count} hours'
            hours_minutes: '%{time} hours'
      

      只需使用
      持续时间
      +
      检查

      seconds = 86400 + 3600 + 15
      ActiveSupport::Duration.build(seconds).inspect
      => "1 day, 1 hour, and 15.0 seconds"
      
      或者它可以是一个小的定制

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

      你可以用它获得秒数

      1.day.to_i
      => 86400
      
      只能以ISO8601格式解析时间

      ActiveSupport::Duration.parse("PT2H15M").inspect
      => "2 hours and 15 minutes"
      
      这对我很有用:

      irb(main):030:0> def humanized_duration(seconds)
      irb(main):031:1>   ActiveSupport::Duration.build(seconds).parts.except(:seconds).reduce("") do |output, (key, val)|
      irb(main):032:2*       output+= "#{val}#{key.to_s.first} "
      irb(main):033:2>     end.strip
      irb(main):034:1>   end
      => :humanized_duration
      irb(main):035:0> humanized_duration(920)
      => "15m"
      irb(main):036:0> humanized_duration(3920)
      => "1h 5m"
      irb(main):037:0> humanized_duration(6920)
      => "1h 55m"
      irb(main):038:0> humanized_duration(10800)
      => "3h"
      

      您可以更改希望结果字符串位于reduce中的格式。我喜欢用“h”和“m”来表示小时和分钟。我从持续时间部分中排除了秒数,因为这对我使用它并不重要。

      你自己尝试过解决这个问题吗?注意:堆栈溢出充满了乐于助人的人,他们愿意帮助您自己编写(即我们不会为您完成所有工作)。。。所以你需要先自己动手写你用谷歌搜索过ruby时间方法吗?基于ruby数的方法?你大概知道你可以从什么算法开始吗?试一试,看看你能想出什么…
      inspect
      方法不应该用于视图中。你应该使用合适的格式化程序。
      10.weeks.inspect
      =“70天”和
      2.hours.inspect
      =“7200秒”<10.weeks.inspect=“10周”和
      2.hours.inspect
      =“2小时”
      =“2小时”
      。很遗憾,他们不能把这个名字复制成另一个名字,因为如果它被称为其他名字,人们不会反对它,否则看起来很完美。还可以很好地处理多个案例:
      (1.month+10.weeks+2.hours)。检查
      =>
      “1个月、10周和2小时”
      。我的意思是,我可以不用最后一个逗号,但这已经足够好了。哇,这太棒了。同意它值得复制,而不是.inspect-daft重写一些内置的东西。不管牛津逗号如何受到尊重,这种对它的诋毁是站不住脚的!
      ActiveSupport::Duration.parse("PT2H15M").inspect
      => "2 hours and 15 minutes"
      
      irb(main):030:0> def humanized_duration(seconds)
      irb(main):031:1>   ActiveSupport::Duration.build(seconds).parts.except(:seconds).reduce("") do |output, (key, val)|
      irb(main):032:2*       output+= "#{val}#{key.to_s.first} "
      irb(main):033:2>     end.strip
      irb(main):034:1>   end
      => :humanized_duration
      irb(main):035:0> humanized_duration(920)
      => "15m"
      irb(main):036:0> humanized_duration(3920)
      => "1h 5m"
      irb(main):037:0> humanized_duration(6920)
      => "1h 55m"
      irb(main):038:0> humanized_duration(10800)
      => "3h"