2011-11-08 203 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

我是一種將所有東西都整理出來的方式,但是這讓我奔跑了......現在只需要寫一些驗證並重構所有內容...非常感謝,從這個小小的努力中學到了很多東西! –