我正在为我的公司建立一个新的时钟系统,我在确定如何在特定日期的所有时间戳之间添加时差时遇到一些麻烦......
这是我的观点......
<% @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
我想要的是能够计算每一天的时间,然后总计为所有人。我知道如何在两次之间获得时差,但是我无法在一整天的时间间隔内获得时间差... ...
我已经在互联网上搜寻了一个我想要完成的事情的例子,并且已经空了......任何想法都会非常感激....
...谢谢
EDIT)
这是我的控制器代码,其中包含部分解决方案,这确实给了我一个总数,但是,由于我如何使用有序哈希,我不能每天都这样做...
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
答案 0 :(得分:3)
给定punches
中的一系列对象,并且它们成对出现,第一个是插入式,第二个是打孔,那么类似这样的东西会给你持续时间:
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
已正确设置和验证。