ruby-on-rails - 数组时间戳之间的时间差

标签 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

我希望能够计算出每天的时间,然后计算出所有时间的总和。我知道如何获得两个时间之间的时差,但我无法全神贯注地获得一天中一系列时间之间的时差......

我在互联网上搜寻了我想要实现的目标的示例,但一无所获......任何想法将不胜感激......

谢谢...

编辑)

这是我的 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 将包含当天的总时间。如果您认为数字索引看起来很难看,您也可以使用 firstlast:

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

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

关于ruby-on-rails - 数组时间戳之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8055640/

相关文章:

ruby-on-rails - 如果存在值(value)就做某事

jquery - 将选定的插件与 Rails Select 一起使用

ruby-on-rails - 如何用belongs_to对象写作用域?

ruby-on-rails - 使用 Rails 的单场淘汰赛

javascript - Rails selectize.js include_blank 或自动完成 : false

Ruby 正则表达式得到由句点分隔的单词组合

ruby-on-rails - Rails 3 caches_page 写入文件但不会在后续命中时从缓存中读取

ruby-on-rails - 对于 Rails 中的某些情况,如何实现是/否而不是 boolean 值?

javascript - 从rails View 文件内的脚本调用js文件内的函数

ruby-on-rails - 如何使用Resque和Redis对队列进行优先级排序