我正在为我的公司构建一个新的时钟系统,但我在弄清楚如何添加特定日期的所有时间戳之间的时间差异时遇到了一些麻烦......
这是我的观点......
<% @punches_days.sort.each do |day, punches|%>
<h3><%= day.strftime('%A %D') %></h3>
<table>
<tr>
<th>Status</th>
<th>Comment</th>
<th>Time</th>
<th></th>
<th></th>
</tr>
<% for punch in punches %>
<tr>
<td><%= punch.status %></td>
<td><%= punch.comment %></td>
<td><%= punch.created_at.in_time_zone(punch.user.time_zone)%></td>
<td><%= link_to 'Show', punch %></td>
<td><%= link_to 'Edit', edit_punch_path(punch) %></td>
<td><%= link_to 'Destroy', punch, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>
<% end %>
产生这个...
Sunday 11/06/11
Status Comment Time
In 2011-11-06 08:00:00 -0500 Show Edit Destroy
Lunch 2011-11-06 12:00:00 -0500 Show Edit Destroy
In 2011-11-06 13:00:00 -0500 Show Edit Destroy
Out 2011-11-06 16:00:00 -0500 Show Edit Destroy
Tuesday 11/08/11
Status Comment Time
In 2011-11-08 08:00:00 -0500 Show Edit Destroy
Lunch 2011-11-08 12:15:00 -0500 Show Edit Destroy
In 2011-11-08 13:00:00 -0500 Show Edit Destroy
Out 2011-11-08 16:41:00 -0500 Show Edit Destroy
我希望能够计算出每天的时间,然后计算出所有时间的总和。我知道如何获得两个时间之间的时差,但我无法全神贯注地获得一天中一系列时间之间的时差......
我在互联网上搜寻了我想要实现的目标的示例,但一无所获......任何想法将不胜感激......
谢谢...
编辑)
这是我的 Controller 代码,其中实现了部分解决方案,这确实给了我一个总数,但是,由于我使用有序哈希的方式,我无法每天执行此操作...
def timecard
@punches = Punch.timecard(params[:user])
@punches_days = @punches.group_by { |t| t.created_at.beginning_of_day}
@in_out_lengths = @punches.each_slice(2).map { |a| a[1].created_at - a[0].created_at }
@total = ((@in_out_lengths.inject(:+))/1.hour).round
respond_to do |format|
format.html # timecard.html.erb
format.json { render :json => @punches }
end
end
最佳答案
给定打洞
中的一组对象,并且它们成对出现,第一个是打洞,第二个是打洞,那么像这样的东西会给你持续时间:
in_out_lengths = punches.each_slice(2).map { |a| a[1].created_at - a[0].created_at }
total = in_out_lengths.inject(:+)
in_out_lengths
数组将包含每个打入/打出对的时间跨度,total
将包含当天的总时间。如果您认为数字索引看起来很难看,您也可以使用 first
和 last
:
punches.each_slice(2).map { |a| a.last.created_at - a.first.created_at }
唯一的技巧是使用 each_slice
将当天的输入/输出数组切成所需的对。完成后,map
和 inject
非常简单。当然,所有这些都假设punches
已正确设置和验证。
关于ruby-on-rails - 数组时间戳之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8055640/