Как узнать, находится ли время в пределах диапазона? - PullRequest
0 голосов
/ 31 января 2019

Я создаю приложение посещаемости и ищу способ проверить, не заносятся ли в журнал их посещаемость в течение часа с их расписанием

Допустим, у Employee1 есть расписание на 31 января 2019 г. @ 00:30но он прибывает и регистрируется заранее, поэтому в его журналах указано, что он регистрируется 30 января 2019 г. в 23:45.Поэтому я пытаюсь выяснить, что если сотрудник войдет в систему в течение часа или часа позже, это будет его время входа в систему.Как будто он может войти в систему с 30 января 2019 года по 23:30 до 31 января 2019 года в 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)
                    });
                }

И это мой текущий оператор LINQ для заполнения моей DataGrid

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);
        }

Это мой источник расписания сотрудников

Employee Schedule

А это мои журналы посещаемости сотрудников

Attendance Logs

Как вывидите, у меня есть 4 дополнительные переменные DateTime, которые я только что добавил, чтобы обрабатывать дополнительные или меньшие часы, но это все еще не работает, но я понятия не имею, почему.

И это текущий вывод Actual Output

Так что мне не хватает данных из-за моих условий, которые должны работать нормально, но с ошибочными результатами.

Any ideas, почему это происходит?

Любые ответы, которые помогли бы мне, были бы великолепны.Спасибо

1 Ответ

0 голосов
/ 31 января 2019

Я думаю, что вы пробуете трудный путь, это должно быть проще.

Чтобы сравнить фактическое время входа в систему с запланированным и проверить, что в течение часа вы можете просто вычесть оба и проверитьРазница.

С помощью 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 отрицательным / положительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...