我在一个场景中运行,我需要找到当前时段的总小时数。我有一个时间和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方法中如何过滤仅属于我的类别的小时数
答案 0 :(得分:2)
答案 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;
基本上,我们首先将日期标准化:
从那里,我们只需要减去两个日期,并处理新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;