2015-06-10 37 views
0

我的代碼below.I想做用戶選擇10.06.2015 09:00 - 12.06.2015 13:00我會顯示2天2小時後。我怎樣才能工作時間日期時間和時間加

但是我想工作日和工作時間之間09:00 - 18:00好的用戶當你10.06.2015 09:00 - 12.06.2015 13:00我想只顯示2,5天。

我該怎麼辦?

DateTime t1 = dateTimePicker1.Value.Date; 
DateTime t2 = dateTimePicker2.Value.Date; 

string s1 = textBox9.Text; 
string s2 = textBox10.Text; 

DateTime dt1 = t1.AddMinutes(DateTime.Parse(s1).TimeOfDay.TotalMinutes); 
DateTime dt2 = t2.AddMinutes(DateTime.Parse(s2).TimeOfDay.TotalMinutes); 

var fark = dt2 - dt1; 

    label1.Text = 
String.Format("{0}{1}{2}",  
fark.Days > 0 ? string.Format("{0} gün", fark.Days) : "", 
fark.Hours > 0 ? string.Format("{0} saat ", fark.Hours) : "", 
fark.Minutes > 0 ? string.Format("{0} dakika ", fark.Minutes) : "").Trim(); 
+0

您應該正確標記您的問題。在這種特殊情況下,你忘了提及你的語言選擇。 –

+0

我加了標籤..你能幫我嗎.. –

+0

週六和週日怎麼樣?那些工作日也是這樣嗎? – Micke

回答

0

那麼你可以假設範圍內的任何日子,除了第一個和最後一個是完整的工作日。所以你需要(AllDaysInRange -2)+ HoursInfirstDay + HoursInLastDay。

TimeSpan ts = t2 - t1; 
ts.Days = ts.Days - 2; //Allow for the 2 end days 

int Day1Hours = t1.Hours - 9;//This removes any hours between 00.00 and 09.00 
if (day1Hours > 9) //Then the user was working past 18.00 
    ts.Days = ts.Days+1 
else 
    ts.Hours = ts.Hours + day1Hours; 

int Day2Hours = t2.Hours - 9;//This removes any hours between 00.00 and 09.00 
if (day2Hours > 9) //Then the user was working past 18.00 
    ts.Days = ts.Days+1 
else 
    ts.Hours = ts.Hours + day2Hours; 

如果你能得到這個工作(我已經從內存中寫的話),那麼我會換行代碼來結束幾天的時間轉換成一個方法,而不是重複它。

+0

但是正如其他人指出的那樣,這不會佔據非工作日的天數。但希望它能給你一個出發點。 (此外,它需要一些錯誤檢測,以防他們選擇少於2天) – Matt

0

根據DateTime Picker In WinForm How To Pick Time?的帖子,你可以改變你的DateTimePicker,以便與時間一起工作。

要限制用戶可以選擇的範圍,您可以修改您的ValueChanged事件或爲其編寫自己的驗證。 也許最簡單的是:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e) 
    { 
     if (dateTimePicker1.Value.Hour < 10) // the 10 is just a random number, you can change it to your own limit 
      dateTimePicker1.Value = this.dateTimePicker1.Value.AddHours(10 - dateTimePicker1.Value.Hour); 
    } 

要根據工作時間計算你一天2,5,我會寫一個函數來處理這個責任,如:

private int TimeInWorkingHours(DateTime start, DateTime end, int firstHour, int lastHour) 
    { 
     int days = Math.Min(end.Subtract(start).Days - 2, 0) ; 
     int hoursInADay = lastHour - firstHour; 

     int result = days * hoursInADay; 

     result += start.Hour - firstHour; 
     result += lastHour - end.Hour; 

     return result; 
    } 

這樣,你叫TimeInWorkingHours( ...)功能與您的開始日期和結束日期,也提供您的第一個和最後一個工作時間。

首先計算工作天數,而不是添加邊界小時數。通過這種方式,您可以獲得工作時間,然後按工作時間分配工作時間以獲得工作日。

+0

此解決方案不排除星期日,星期六或假期。如果你希望這樣做,你應該實現一個像IsHoliday(DateTime day){...}這樣的函數,並減少非工作日的總日數。 –

0

試試這個

bool IsWorkingDay(DateTime dt) 
{ 
    int year = dt.Year; 
    Dictionary<DateTime, object> holidays = new Dictionary<DateTime, object>(); 
    holidays.Add(new DateTime(year, 1, 1), null); 
    holidays.Add(new DateTime(year, 1, 6), null); 
    holidays.Add(new DateTime(year, 4, 25), null); 
    holidays.Add(new DateTime(year, 5, 1), null); 
    holidays.Add(new DateTime(year, 6, 2), null); 
    holidays.Add(new DateTime(year, 8, 15), null); 
    holidays.Add(new DateTime(year, 11, 1), null); 
    holidays.Add(new DateTime(year, 12, 8), null); 
    holidays.Add(new DateTime(year, 12, 25), null); 
    holidays.Add(new DateTime(year, 12, 26), null); 
    DateTime easterMonday = EasterSunday(year).AddDays(1); 
    if (!holidays.ContainsKey(easterMonday)) 
     holidays.Add(easterMonday, null); 

    if (!holidays.ContainsKey(dt.Date)) 
     if (dt.DayOfWeek > DayOfWeek.Sunday && dt.DayOfWeek < DayOfWeek.Saturday) 
      return true; 

    return false; 
} 

string WorkingTime(DateTime dt1, DateTime dt2) 
{ 
    // Adjust begin datetime 
    if (IsWorkingDay(dt1)) 
    { 
     if (dt1.TimeOfDay < TimeSpan.FromHours(9)) 
      dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0); 
     else if (dt1.TimeOfDay > TimeSpan.FromHours(13) && dt1.TimeOfDay < TimeSpan.FromHours(14)) 
      dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 14, 0, 0); 
     else if (dt1.TimeOfDay > TimeSpan.FromHours(18)) 
      dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0).AddDays(1); 
    } 
    else 
     dt1 = new DateTime(dt1.Year, dt1.Month, dt1.Day, 9, 0, 0).AddDays(1); 

    // Adjust end datetime 
    if (IsWorkingDay(dt2)) 
    { 
     if (dt2.TimeOfDay < TimeSpan.FromHours(9)) 
      dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0).AddDays(-1); 
     else if (dt2.TimeOfDay > TimeSpan.FromHours(18)) 
      dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0); 
     else if (dt2.TimeOfDay > TimeSpan.FromHours(13) && dt2.TimeOfDay < TimeSpan.FromHours(14)) 
      dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 13, 0, 0); 
    } 
    else 
     dt2 = new DateTime(dt2.Year, dt2.Month, dt2.Day, 18, 0, 0).AddDays(-1); 

    double days = 0; 
    double hours = 0; 
    double minutes = 0; 

    if (dt2 > dt1) 
    { 
     // Move dt1 forward to reach dt2 day chacking for working days 
     while (dt1.DayOfYear < dt2.DayOfYear) 
     { 
      if (IsWorkingDay(dt1)) 
       days++; 
      dt1 = dt1.AddDays(1); 
     } 

     // Now get the worked hours as if were on the same day in the same manner 
     TimeSpan sdwt = dt2 - dt1; 
     if (dt1.TimeOfDay < TimeSpan.FromHours(13) && dt2.TimeOfDay > TimeSpan.FromHours(14)) 
      sdwt -= TimeSpan.FromHours(1); 
     if (sdwt == TimeSpan.FromHours(8)) 
      days++; 
     else 
     { 
      hours = sdwt.Hours; 
      minutes = sdwt.Minutes; 
     } 
    } 

    // There is a pause in between so adjust if the interval include it 

    var totalminutes = (days * 8 * 60 + hours * 60 + minutes); 

    string res = String.Format("{0} days {1} hours {2} minutes", 
     days, 
     hours, 
     minutes); 
    string totRes = String.Format("{0} days {1} hours {2} minutes", 
     totalminutes/8/60, 
     totalminutes/8, 
     totalminutes); 

    return res + "\r\n" + totRes; 
} 
+0

謝謝。但我想要在平日裏工作。還有一個問題。當我選擇11.6.2015 9:00 - 13.06.2015 13:00 =只有總小時和工作時間.. –

0

試試這個

private void GetProperOfficeHours(ref DateTime date) 
    { 
     int minHour = 9, maxHour = 17; 

     if (date.Hour < minHour) //if earlier than office hours - start from 9am 
     { 
      date = date + new TimeSpan(9, 0, 0); 
     } 
     else if (date.Hour > maxHour) //if later than office hours - go to next day 9am 
     { 
      date = date.AddDays(1) + new TimeSpan(9, 0, 0); 
     } 
    } 

則...

//assuming firstDate & lastDate have date and time 
     int[] weekendDays = new int[2] { 0, 6 }; // Sunday and Saturday 

     GetProperOfficeHours(ref firstDate); 
     GetProperOfficeHours(ref lastDate); 

     while (weekendDays.Contains((int)firstDate.DayOfWeek)) 
     { 
      //get next date 
      firstDate = firstDate.AddDays(1); 
     } 

     while (weekendDays.Contains((int)lastDate.DayOfWeek)) 
     { 
      //get prev date 
      lastDate = lastDate.AddDays(-1); 
     } 

     double hourDiff = Math.Abs(firstDate.Hour - lastDate.Hour)/8.0; //8 office hours 
     double dayDifference = 0; 
     while (firstDate.Date <= lastDate.Date) //Loop and skip weekends 
     { 
      if (!weekendDays.Contains((int)firstDate.DayOfWeek)) //can also check for holidays here 
       dayDifference++; 

      firstDate = firstDate.AddDays(1); 
     } 

     dayDifference = dayDifference + hourDiff; 

可能需要一些調整,希望對您有所幫助。

相關問題