获取时间段之间的小时数

时间:2016-07-12 06:07:00

标签: c# linq datetime

我在一个场景中运行,我需要找到当前时段的总小时数。我有一个时间和TimeOut日期时间,我希望得到员工在第二天晚上10点到凌晨4点之间工作的时间。我如何获得工作小时的输出。

我创建了一个像这样的扩展方法:

 public static decimal GetNightDifferentialValue(this DailyTime dtr, Employee201 employee, PayrollSettings settings, IEnumerable<Holidays> holidays)
    {
        //know if the time out is greater than 10pm of the dtr
        //07-26-2016 14:00 - 07-27-2016 03:00
        //if time out i
        var days = Enumerable.Range(0, (int)(dtr.TimeOut - dtr.TimeIn).TotalHours + 1)
            .Select(i => dtr.TimeIn.AddHours(i))
            .Where(date => !(date.Hour >= 22)).Count();
        return days* employee.Rate;

    }

我的问题出在Where Where方法中如何过滤仅属于我的类别的小时数

6 个答案:

答案 0 :(得分:2)

我发现问题仅在于过滤,我建议比较Date部分以确定下一个是Date,如果是下一个日期则查找TimeOfDay进行比较{{1 }}

Time

选中此Demo

答案 1 :(得分:1)

 public static decimal GetNightDifferentialValue(this DailyTime dtr, Employee201 employee, PayrollSettings settings, IEnumerable<Holidays> holidays)
    {
        //know if the time out is greater than 10pm of the dtr
        //07-26-2016 14:00 - 07-27-2016 03:00
        //if time out i
        DateTime dayIn10pm = new DateTime(dtr.TimeIn.Year, dtr.TimeIn.Month, dtr.TimeIn.Day, 22, 0, 0);
        DateTime dayAfter04am = dayIn10pm.Add(new TimeSpan(6,0,0));

        var hours = Enumerable.Range(0, (int)(dtr.TimeOut - dtr.TimeIn).TotalHours + 1)
            .Select(i => dtr.TimeIn.AddHours(i))
            .Where(date => (date > dayIn10pm && date <= dayAfter04am)).Count();
        return hours;

    }

答案 2 :(得分:0)

我认为这可以满足您的需求:

if (timeOut.Hour > 4)
{
    timeOut = timeOut.Date.AddHours(4);
}

if (timeIn.Hour < 22)
{
    timeIn = timeIn.Date.AddHours(22);
}

if (timeIn > timeOut)
{
    // No overnight time
    return 0;
}

var difference = timeOut - timeIn;

return difference.TotalHours;

基本上,我们首先将日期标准化:

  • 如果员工在晚上10点之前到达这里,请考虑他是在晚上10点在那里
  • 如果员工在凌晨4点后离开,请考虑他早上4点离开

从那里,我们只需要减去两个日期,并处理新timeIn大于新timeOut的特殊情况(例如,如果他工作时间从下午2点到下午5点)。在这种情况下,这意味着在晚上10点到凌晨4点之间没有时间,所以我们只返回0。

请注意,此算法不能处理员工连续工作超过24小时的情况。

答案 3 :(得分:0)

  private void CalculateTotalHour(string dtstartTime, string dtendTime)
    {

            DateTime d1 = new DateTime();
            d1 = Convert.ToDateTime(dtstartTime); DateTime d2 = new DateTime();
            d2 = Convert.ToDateTime(dtendTime);

            if (d1.Hour >= 12)
            {
                d1 = d1.AddDays(-1);
            }
            else if (d2.Hour >= 12)
            {
                d2 = d2.AddDays(1);
            }

          //  if (d2 < d1)
           //  MessageBox.Show("shift end time is lesser than shift start time", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Stop);
             TimeSpan ts = d2.Subtract(d1).Duration();
           // ts.ToString(@"hh\:mm")//total dur
    }

答案 4 :(得分:0)

得到我想要的东西,但这不是一个好看的解决方案,这是我的解决方案:

var originalLineDraw = Chart.controllers.bar.prototype.draw;

Chart.helpers.extend(Chart.controllers.bar.prototype, {
  draw: function() {
    originalLineDraw.apply(this, arguments);

    var chart = this.chart;
    var ctx = chart.chart.ctx;

    var index = chart.config.data.lineAtIndex;
    if (index) {
      var xaxis = chart.scales['x-axis-0'];
      var yaxis = chart.scales['y-axis-0'];

      ctx.save();
      ctx.beginPath();
      ctx.moveTo(xaxis.getPixelForValue(undefined, index), yaxis.left);
      ctx.strokeStyle = '#ff0000';
      ctx.lineTo(xaxis.getPixelForValue(undefined, index), yaxis.right);
      ctx.stroke();
      ctx.restore();
    }
  }
});

var config = {
    type: type,
    data:  jQuery.extend(true, {}, data),
    options: this.chartdata.options,
    lineAtIndex: 2
};

new Chart(ctx, config);  

这是演示Demo

答案 5 :(得分:-2)

我认为这是你的答案

int hours = (int)(dt2 - dt1).TotalHours;