Foo.first = {id: 1, start:2000-01-01 07:00:00 UTC, end: 2000-01-01 12:00:00 UTC, total_hours_worked: nil}
这里以 end
为例。
我为Foo
和t.time
创建了start
end
因为我只需要小时/分钟。我从来没有和Time对象合作过,所以请耐心等待。
我需要通过start
和end
start = Foo.find(1).start
end = Foo.find(1).end
start + end #=> errors
start.to_i + end.to_i = 1893438000 #=> What's that?
distance_of_time_in_words(start.to_i + end.to_i) #=> "about 60 years" What?
我期待5:00:00
。我知道5:00:00
实际上意味着凌晨5点,但上下文将使用不同的。
我做过几次搜索this。我真的不想在Rails / Ruby中使用更多的宝石“应该在方法中烘焙。”
我的问题将找到我真正想要实现的目标的答案(获得本周工作的总时数):
Foo.pluck(:total_hours_worked).sum(&:to_d) #=> best way?
:total_hours_worked
将成为一个字符串,只是为了使事情变得简单。
答案 0 :(得分:3)
以下是您获得所需格式的方式("5:00:00"
):
# Monkeypatch Integer class to add a new method
class Integer
def pretty_duration
seconds = self % 60
minutes = (self / 60) % 60
hours = self / (60 * 60)
format('%02d:%02d:%02d', hours, minutes, seconds)
end
end
# Get start and end time converted into integers
timestart = (Time.now - 5.hours).to_i
timeend = Time.now.to_i
# Use pretty_duration method.
# P.S. Difference between time objects already gives you a number, but we need Integer
(timeend - timestart).pretty_duration
#=> "05:00:00"
此设置允许您不依赖于Rails视图助手(distance_of_time_in_words
),因为您可能需要在视图之外的某处格式化时间。
我的问题将找到我真正想要实现的目标的答案 (获得本周工作的总时数):
Foo.pluck(:total_hours_worked).sum(&:to_d)
#=>最好的办法?哪里:total_hours_worked
将是一个字符串,只是为了减少事情 复杂。
最有效的方法(如果您确定将total_hours_worked
作为正确格式的字符串)将在数据库级别上将其转换为十进制:
Foo.sum('total_hours_worked::decimal')
答案 1 :(得分:0)
答案 2 :(得分:0)
end
是一个关键字。您无法为其指定值。
现在,获得时差:
start = "2000-01-01 07:00:00 UTC".to_time
endtime = "2000-01-01 12:00:00 UTC".to_time
difference = ((endtime - start) / 1.hour)
# => 5.0
或使用帮助
distance_of_time_in_words(endtime, start)
# => "about 5 hours"
答案 3 :(得分:0)
使用以下代码获取差异,并将格式为“5:00:00”
distance_of_time_in_words(end.to_i - start.to_i).strftime("%H%M%S")
t.strftime("%H:%M:%S") > "22:49:27"