2011-11-08 176 views
2

我建立一个新的时钟进度系统为我公司和我有一些麻烦搞清楚如何在某一特定日期添加所有的时间戳之间的时间差......时差阵列时间戳之间

这里是我的看法....

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

我对你的数据有点困惑。看起来好像有人在周日的12:15冲刺,直到周二11:10才打出拳头。这是一个很长的转变。 –

+0

我想这将是大声笑,但这只是样本数据,我还没有写验证,以赶上这样的事情呢...只是试图把现在的坚果和螺栓...... –

+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已正确设置和验证。

+0

这是让我非常接近......我遇到了一些问题,在我的“拳击日”中调用each_slice方法,因为事实上我实际上是从一个有序哈希中得到的......我可以很容易地得到整个这个tho ,所以我可以看到一些光。我在这里添加我的控制器src,这样你就可以看到我的数组是如何布局的。 –

+0

@Chase:那你把它全部整理出来了吗?对不起,我刚刚在这里开始我的一天。 –

+0

我是一种将所有东西都整理出来的方式,但是这让我奔跑了......现在只需要写一些验证并重构所有内容...非常感谢,从这个小小的努力中学到了很多东西! –