我正在创建一个考勤应用程序,我正在寻找一种方法来检查他们的考勤日志是否在他们的日程安排的一个小时内
假设 Employee1 的日程安排为 2019 年 1 月 31 日 @ 00:30,但他提前到达并签到,因此他的日志显示他在 2019 年 1 月 30 日 @ 23:45 签到。所以我试图发现,如果员工在提前一个小时或晚一个小时内登录,那将是他的登录时间。比如他可以在2019年1月30日23:30到2019年1月31日01:30之间登录。
我现在所做的是我有 4 个 DateTime 变量来处理这些,但它似乎不起作用。
所以这是我的员工类
public class Emp1
{
public int ID { get; set; }
public DateTime In { get; set; }
public DateTime Out { get; set; }
public DateTime dateTime1 { get; set; }
public DateTime dateTime2 { get; set; }
public DateTime dateTime3 { get; set; }
public DateTime dateTime4 { get; set; }
}
我的实际出勤日志类
public class Actual
{
public int ID { get; set; }
public DateTime ActualLog { get; set; }
public int LogStatus { get; set; }
public DateTime date { get; set; }
}
所以这是我如何填充员工时间表的代码
List<Emp1> em = new List<Emp1>();
foreach (DataRow row in empContainer.Rows)
{
em.Add(new Emp1()
{
ID = Convert.ToInt32(row[0].ToString()),
In = Convert.ToDateTime(row[1].ToString()),
Out = Convert.ToDateTime(row[2].ToString()),
dateTime1 = Convert.ToDateTime(row[1].ToString()).AddHours(1),
dateTime2 = Convert.ToDateTime(row[1].ToString()).AddHours(-1),
dateTime3 = Convert.ToDateTime(row[2].ToString()).AddHours(1),
dateTime4 = Convert.ToDateTime(row[2].ToString()).AddHours(-1)
});
}
这是我当前用于填充 DataGrid 的 LINQ 语句
public void Main()
{
List<Emp1> emps;
List<Actual> actuals;
actuals = emp.GetActual(@"C:\Users\IT\Desktop\Sample\SampleActual.dat");
emps = GetEmpSched();
var final = (from a1 in actuals
join a2 in actuals on a1.ID equals a2.ID
join t1 in emps on a1.ID equals t1.ID
join t2 in emps on a2.ID equals t2.ID
where ((a1.LogStatus == 0) && (a2.LogStatus == 1)) && ((t1.In == t2.In) && (t1.Out==t2.Out)) && ((t1.dateTime1 > a1.ActualLog) && (a1.ActualLog > t1.dateTime2)) && ((t2.dateTime3 > a2.ActualLog) && (a2.ActualLog > t2.dateTime4))
select new
{
User_ID = t1.ID,
Scheduled_In = t1.In,
Actual_Login = a1.ActualLog,
Scheduled_Out = t2.Out,
Actual_Out = a2.ActualLog
}).Distinct(). ToList();
tbContainer = StaticClasses.ToDataTable(final);
dgvAttendance.ItemsSource = emp.CalculateEmployeeAttendance(tbContainer);
}
这是我的员工日程表源
这是我的员工出勤记录
如您所见,我刚刚添加了 4 个额外的 DateTime 变量来处理额外或更少的时间,但它仍然不起作用,我不知道为什么。
因此,由于我的条件,我丢失了数据,这应该可以正常工作但会产生错误的输出。
知道为什么会这样吗?
任何能帮助我的答案都会很棒。谢谢
最佳答案
我认为你正在努力尝试,这应该更简单。
要将实际登录时间与预定登录时间进行比较并检查是否在一小时内,您可以将两者相减并检查差异。
使用 C# 很容易:
var scheduledLogIn = new TimeSpan(8, 0, 0);
var actualLogIn = new DateTime(2019, 1, 31, 8, 15, 27);
var delay = (actualLogIn.TimeOfDay - scheduledLogIn).Duration();
if (delay.TotalHours < 1)
{
// It's ok
} else
{
// more than 1h earlier or late!
}
如果您有兴趣检查它实际上是早了还是晚了,请删除 Duration 并检查 TotalHours 是负数还是正数。
关于c# - 如何查找时间是否在一组范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54455701/