如何添加存储为字符串的小时和分钟

use*_*384 3 ruby ruby-on-rails

我正在尝试添加存储在数据库中的小时和分钟,如下所示:

+----+---------+-------+
| id | user_id | time  |
+----+---------+-------+
|  1 |       4 | 03:15 |
|  2 |       4 | 02:22 |
+----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

time领域是一个string.如何添加字符串表示的小时和分钟05:37

我试过这个

current_user.table.pluck(:time).sum(&:to_f)
Run Code Online (Sandbox Code Playgroud)

但输出只是5.

Car*_*and 9

如果你从表中读取数组中的时间,你会得到类似的东西

arr = ["03:15", "02:22"]
Run Code Online (Sandbox Code Playgroud)

然后你可以写

arr.sum do |s|
  h, m = s.split(':').map(&:to_i)
  60*h + m
end.divmod(60).join(':')
  #=> "5:37"
Run Code Online (Sandbox Code Playgroud)

参见Array#sum(在MRI v2.4中介绍)和Integer #divmod.要支持2.4之前的Ruby版本,请使用Enumerable#reduce代替Array#sum.

这三个步骤如下.

mins = arr.sum do |s|
  h, m = s.split(':').map(&:to_i)
  60*h + m
end
  #=> 337
hm = mins.divmod(60)
  #=> [5, 37]
hm.join(':')
  #=> "5:37"
Run Code Online (Sandbox Code Playgroud)


Nez*_*zir 6

请在ruby中查看这个求和时间样本:

require 'time'

t = Time.parse("3:15")
puts t.strftime("%H:%M")

t2 = Time.parse("02:22")
puts t2.strftime("%H:%M")
t3 = t.to_i + t2.to_i

puts Time.at(t3).utc.strftime("%H:%M")
Run Code Online (Sandbox Code Playgroud)

这是24小时跨度以下的快速总和.要获得每种情况的正确解决方案,请查看上面的@Cary代码.

这是一个由@Cary代码示例制作的小型Ruby Gem,它使用方法sum_strings扩展Ruby Array类,例如:

["12:23","23:30","1:2"].sum_strings(':') 将结果为" 36:55"

宝石https://github.com/nezirz/sum_strings/

使用Gem的示例项目:https://github.com/nezirz/use_sum_strings

  • 我建议你使用`strptime`而不是`parse`.用于解释`parse`问题的标准示例是`Time.parse("这对Elizabeth May来说是艰难的一周.")#=> 2018-05-01 00:00:00 -0700`.否则,好的答案. (4认同)
  • 拿着电话!尝试将第一个语句更改为`t = Time.parse("23:15")`.你应该得到"25:37"作为总数,但超过24小时就有问题. (3认同)