簡體   English   中英

如何查找時間是否在一組范圍內?

[英]How to find if time is within A set of range?

我正在創建一個出勤申請表,我正在尋找一種方法來檢查他們的出勤日志是否在他們的時間表的一個小時內

讓我們說員工1的時間表是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!
    }

如果您有興趣檢查它是否實際上更早或更晚,請刪除持續時間並檢查TotalHours是否為正/負。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM