我怎样才能得到上午至下午和下午至上午的时间间隔

时间:2014-07-18 03:52:07

标签: c#

我需要帮助的人我正在创建一个加班计算,当我试图获得值hrs的值时,当我减去PM到AM和PM到PM时,它变为负数,因为我需要计算当它达到10时的hrs :00 PM继承我的代码

         string value = comboBox91.Text;
         string value2 = comboBox92.Text;
         string awtsu = value;
         DateTime dt;
         DateTime dt2;

         dt = DateTime.Parse(value);
         string mystring;
         mystring = dt.ToString("hh:mm tt");

         dt2 = DateTime.Parse(value2);
         string mystring2;
         mystring2 = dt2.ToString("hh:mm tt");


         double diff2 = (dt2 - dt).TotalHours;
         textBox8.Text = Convert.ToString(diff2) + "Hrs";

         string pmm = "10:00 PM";

         DateTime pm = DateTime.Parse(pmm);
         string mystring3;
         mystring3 = pm.ToString("hh:mm tt");




         if (dt2 > pm)
         {
             double diff = (dt - dt2).TotalHours;
             textBox9.Text = Convert.ToString(diff) + "Hrs";


         }
         else
         {
             textBox9.Text = ("0");
         }

$

1 个答案:

答案 0 :(得分:0)

让我看看我是否理解你的要求:

  1. 工作人员在标准时间(上午8:30)开始,通常在标准时间(下午6:30)结束,但可能稍后工作。从理论上讲,这个人可能会在午夜到第二天工作。

  2. 如果他们的工作时间是晚上7点到晚上10点,他们可以获得一个加班费。

  3. 如果他们的工作时间超过10小时,那么这些小时的费用是第二次。

  4. 因此,您在代码中声明的第一件事就是这些加班边界的列表:

        public static readonly TimeSpan[] OvertimeBoundaries = 
        {
            TimeSpan.FromHours(19), // 7 PM
            TimeSpan.FromHours(22)  // 10 PM.
        };
    

    TimeSpan是一个表示时间间隔的结构,适合表示每日事件。

    接下来,考虑到工人的开始和结束时间,您需要测量每个时间间隔的总小时数:

        public static TimeSpan[] GetOvertimeWorked(DateTime startDateTime, DateTime endDateTime, IList<TimeSpan> overtimeBoundaries)
        {
            var overtimeWorked = new TimeSpan[overtimeBoundaries.Count];
    
            for (int i = 0; i < overtimeBoundaries.Count - 1; i++)
            {
                var time1 = startDateTime.Date + overtimeBoundaries[i];
                var time2 = startDateTime.Date + overtimeBoundaries[i + 1];
                if (time1 > time2)
                    throw new ArgumentException("overtimeBoundaries are not in order");
                if (endDateTime > time2)
                    overtimeWorked[i] = time2 - time1;
                else if (endDateTime > time1)
                    overtimeWorked[i] = endDateTime - time1;
                else
                    overtimeWorked[i] = TimeSpan.Zero;
            }
    
            if (overtimeWorked.Length > 0)
            {
                var timeLast = startDateTime.Date + overtimeBoundaries[overtimeBoundaries.Count - 1];
                if (endDateTime > timeLast)
                    overtimeWorked[overtimeBoundaries.Count - 1] = endDateTime - timeLast;
                else
                    overtimeWorked[overtimeBoundaries.Count - 1] = TimeSpan.Zero;
            }
    
            return overtimeWorked;
        }
    

    最后,你需要提取适当的日期和时间。来自您的用户界面的时间信息,调用上述实用程序以获得加班时间并显示它。

    如果你有意义地命名你的变量而不是像#34; dt2&#34;这样的名字,你的代码会更容易理解。和&#34; awtsu&#34;。您还应该至少将业务逻辑与从用户界面加载和卸载数据的代码分开。

    最后,我会注意到以下情况很危险:

        string pmm = "10:00 PM";
        DateTime pm = DateTime.Parse(pmm);
    

    这里的问题是,如果你传递&#34; DateTime.Parse&#34;一个只有&#34;时间的字符串&#34;组件,它将fill in the date information with the current clock setting on your computer。如果您将应用程序投入生产,这可能会产生随机,难以重现的错误,因为应用程序可能会或可能不会在工作人员工作的不同日期运行!