【问题标题】:How to find if time is within A set of range?如何查找时间是否在一组范围内?
【发布时间】:2019-01-31 07:51:47
【问题描述】:

我正在创建一个考勤应用程序,并且我正在寻找一种方法来检查他们的考勤日志是否在他们的日程安排的一个小时内

假设 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 变量来处理额外或更少的时间,但它仍然不起作用,我不知道为什么。

这是当前的输出

因此,由于我的情况,我丢失了数据,这应该可以正常工作,但会产生错误的输出。

任何想法为什么会发生这种情况?

任何可以帮助我的答案都会很棒。谢谢

【问题讨论】:

  • 不清楚您要做什么。你到底从什么开始,你的预期输出是什么? Convert.ToDateTime(row[1].ToString()).AddHours(1) 也没有任何意义。您有一个日期时间,首先转换为字符串,然后将其转换回日期时间。一开始是约会时间,何必呢?
  • @AndreiDragotoniu 初学者错误,正如我所说,我的预期输出是我想在员工预定轮班前一小时或之前检查是否有考勤日志。我的主要问题是,当一名员工有一个时间表,比如说午夜后 30 分钟,他很早就到了 Time in,它不会注册。这就是为什么我有 AddHours 功能
  • 我猜他使用了 .ToString() 因为 DataRow 的索引返回一个对象。使用其他一些机制来访问单元格数据可能更聪明。例如:字段扩展。无论如何,这不是问题。你真的想一键处理这种数据吗?我想顺序处理可以给你更多的空间。
  • @sac1 我希望将它放在一个 select 语句中,因为数据的实际来源已经来自 2 个文件。但如果不可能,我也在看。
  • @sac1 我只是想检查是否有提前一小时或排班前的考勤记录。

标签: c# list linq datetime


【解决方案1】:

我认为你正在努力,这应该更简单。

要将实际登录时间与预定时间进行比较,并检查是否在一个小时内,您可以将两者相减并检查差异。

使用 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 是否为负/正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多