2015-08-11 4 views
1

Я хочу знать рабочие дни, когда я выбираю дату в этой сетке. Я пробовал JavaScript-код, который работает, но у меня есть некоторые трудности с его использованием в C#.Рассчитать рабочее время/рабочий день C#

enter image description here

 string startdate, enddate; 
     startdate = ""; 
     enddate = ""; 

     foreach (GridViewRow row in DateGrid.Rows) 
     { 

      if (row.RowType == DataControlRowType.DataRow) 
      { 
       CheckBox chkRow = (row.Cells[0].FindControl("DateChBox") as CheckBox); 
       if (chkRow.Checked) 
       { 
        startdate = row.Cells[2].Text; 
        enddate = row.Cells[3].Text; 

    // Validate input 
    if (enddate < startdate) 
    return 0; 

// Calculate days between dates 
var millisecondsPerDay = 86400 * 1000; // Day in milliseconds 
startdate.setHours(0, 0, 0, 1); // Start just after midnight --> how to do this in c#? 
enddate.setHours(23, 59, 59, 999); // End just before midnight --> how to do this in c#? 
var diff = enddate - startdate; // Milliseconds between datetime objects  
var days = Math.Ceiling(diff/millisecondsPerDay); 

// Subtract two weekend days for every week in between 
var weeks = Math.Floor(days/7); 
days = days - (weeks * 2); 

//// Handle special cases --> this is not necessary because I choose the date 
//var startDay = startdate.getDay(); 
//var endDay = enddate.getDay(); 

// Remove weekend not previously removed. 
if (startDay - endDay > 1)   
    days = days - 2;  

// Remove start day if span starts on Sunday but ends before Saturday 
if (startDay == 0 && endDay != 6) { 
    days = days - 1; 
} 

// Remove end day if span ends on Saturday but starts after Sunday 
if (endDay == 6 && startDay != 0) { 
    days = days - 1; 
} 

мне нужна помощь, чтобы использовать его в C#, если это возможно.

+0

попробуйте 'System.Datetime.Parse', он вернет вам дату в полночь и начнет использовать его как startdate, а затем обработает его с помощью той же функции и добавит 23 часа, 59 мин. и 59 сек. to enddate –

+0

, пожалуйста, прочитайте о 'System.Datetime' объекте –

ответ

2

Сначала вы преобразовать даты в DateFormat и петли из StartDate в endday

, то вы можете использовать как этот

if (!(toValidate.DayOfWeek == DayOfWeek.Sunday || toValidate.DayOfWeek == DayOfWeek.Saturday)) 
      { 
       // do your logic 
      } 

UPDATE

  int countWorkingDays= 0; 
      string startdate1 = "2014/04/28"; 
      string enddate1 ="2014/09/12"; 

      DateTime startdate= DateTime.ParseExact(startdate1, "yyyy/MM/dd",System.Globalization.CultureInfo.InvariantCulture); 
      DateTime enddate= DateTime.ParseExact(enddate1, "yyyy/MM/dd",System.Globalization.CultureInfo.InvariantCulture); 
      DateTime date =startdate; 
      while (date<= enddate) 
      { 
       if (!(date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday)) 
       { 
        countWorkingDays++; 
       } 
       date= date.AddDays(1); 
      } 
      Console.WriteLine("WorkingDays " +countWorkingDays); 
+0

@ У Nakala есть код с тем, что вы написали, но он дает мне неправильные дни .. например, во вторую строку даты, возвращает что-то вроде 342 рабочих дней –

+0

@MaraPimentel: Обновление – Nalaka

+0

I сделало это :) Я обновлю свой вопрос, чтобы помочь кому-то с той же проблемой. Но когда я делаю reponse.write, я также вижу, сколько дней дата дает мне 1,2,3,4 ... 99 (выбранная дата имеет 100 рабочих дней). Как я могу вернуть только 100 рабочих дней, чтобы показать на этикетке или что-то еще? –

0
for (DateTime date = Start_Date; date <= End_Date; date = date.AddDays(1)) 
    { 
     if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday) 
     { 
      yield return date; 
     } 
    } 

удаляет выходные из диапазон дат.

Смежные вопросы