2014-07-18 73 views
-2

我需要帮助家伙即时创建加班计算,当即时通讯尝试获得价值小时它成为负面时,我将PM减去上午和PM到PM怎么把我需要的时候它到达下午10:00继承人我的代码来算小时我怎样才能得到小时上午到下午和下午到上午的时间间隔

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

$

回答

0

让我看看,如果我理解您的需求:

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

  2. 如果他们在上午7点工作到晚上10点,他们将获得一次加班费。

  3. 如果他们在10点以上工作,那么这些小时将被支付第二种费率。

所以,你会在你的代码申报的第一件事就是这些加班边界的列表:

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

最后,你需要从用户提取相应的日期&时间信息界面,调用上面的工具来获得超时工作时间,并显示它。

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

最后,我会注意,以下是危险的:

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

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

+0

umm在我的情况下,所有员工在上午8:30开始,并在下午6:30结束后,加班开始于晚上7点,并在晚上10点钟到达另一个小时。因为晚上10点以后加班的工资增加了。这意味着晚上7点至10点和晚上10点是不同的薪水。帮助我们thx – cddr2012

+0

因此,您需要7到10小时的工作时间,以及10小时后工作的小时数? – dbc

+0

是的,先生正好..当我即将获得在凌晨七点之间的时间在凌晨两点之间的价值是不正确 – cddr2012

相关问题