阵列时间戳之间的时差

时间:2011-11-08 18:55:28

标签: ruby-on-rails ruby ruby-on-rails-3 time

我正在为我的公司建立一个新的时钟系统,我在确定如何在特定日期的所有时间戳之间添加时差时遇到一些麻烦......

这是我的观点......

<% @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

1 个答案:

答案 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将为当天的总时间。如果您认为数字索引看起来很丑,您还可以使用firstlast

punches.each_slice(2).map { |a| a.last.created_at - a.first.created_at }

唯一的技巧是使用each_slice将当天的输入/输出阵列切换成所需的对。完成后,mapinject非常简单。当然,所有这一切都假设punches已正确设置和验证。