2012-02-20 14 views
1

Salut je suis nouveau à c# et la programmation en général j'ai essayé d'apprendre d'adapter d'autres peuples code le code ci-dessous j'ai changé le code que je veux pour calculer le montant de jours de travail restants dans un mois, mais le problème est le code s'exécute sur le nombre de jours dans un mois donc ce mois-ci a 29 jours mais les erreurs de code que le code s'exécute à la 30e Je ne peux pas savoir quelle partie du code pour changer toute aide serait grandeC# comment calculer les jours ouvrables restants dans un mois

private void days() 
    { 

     //Monday to Friday are business days. 
     var weekends = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday }; 
     DateTime testing = DateTime.Now; 



     string month1 = testing.ToString("M "); 
     string year1 = testing.ToString("yyyy"); 
     int month = Convert.ToInt32(month1); 
     int year = Convert.ToInt32(year1); 


     //Fetch the amount of days in your given month. 
     int daysInMonth = DateTime.DaysInMonth(year, month); 
     string daysleft = testing.ToString("d "); 
     int daystoday = Convert.ToInt32(daysleft); 

     //Here we create an enumerable from 1 to daysInMonth, 
     //and ask whether the DateTime object we create belongs to a weekend day, 
     //if it doesn't, add it to our IEnumerable<int> collection of days. 
     IEnumerable<int> businessDaysInMonth = Enumerable.Range(daystoday, daysInMonth) 
               .Where(d => !weekends.Contains(new DateTime(year, month, d).DayOfWeek)); 

     //Pretty smooth. 

     int count = 0; 
     foreach (var day in businessDaysInMonth) 
     { 
      count = count + 1; 
     } 
     textBox9.Text = count.ToString(); 


    } 
} 

Répondre

9
public static IEnumerable<int> Range(int start, int count) 

Comme vous pouvez voir le deuxième paramètre n'est pas la fin, mais le compte.

Le nombre que vous voulez est probablement: daysInMonth - daystoday + 1

Je aurait Ressaisissez votre code comme:

private static readonly DayOfWeek[] weekends = new DayOfWeek[] { DayOfWeek.Saturday, DayOfWeek.Sunday }; 

bool IsWorkDay(DateTime day)//Encapsulate in a function, to simplify dealing with holydays 
{ 
    return !weekends.Contains(day.DayOfWeek); 
} 

int WorkDaysLeftInMonth(DateTime currentDate) 
{ 
    var remainingDates = Enumerable.Range(currentDate.Day,DateTime.DaysInMonth(currentDate.Year,currentDate.Month)-currentDate.Day+1) 
         .Select(day=>new DateTime(currentDate.Year, currentDate.Month, day)); 
    return remainingDates.Count(IsWorkDay); 
} 
4

Il n'y a pas besoin de convertir votre date à une chaîne, puis analyser les composants revenir à des valeurs entières . Découvrez les propriétés "Month", "Day" et "Year" du "test" DateTime.

(CodeInChaos a votre réponse, mais cela est un fait amusant qui va simplifier votre code grandement.)

0
private int GetWorkingDaysLeftInMonth() 
    { 
     // get the daysInMonth 
     int daysInMonth = GetDaysInMonth(); 

     // locals 
     int businessDaysInMonth = 0; 
     int day = DateTime.Now.Day; 
     bool isWeekDay = false; 

     int currentDay = (int) DateTime.Now.DayOfWeek; 
     DayOfWeek dayOfWeek = (DayOfWeek)currentDay; 

     // iterate the days in month 
     for (int x = day; x < daysInMonth; x++) 
     { 
      // increment the current day 
      currentDay++; 

      // if the day is greater than 7 
      if (currentDay > 7) 
      { 
       // reset the currentDay 
       currentDay = 1; 
      } 

      // get the dayOfWeek 
      dayOfWeek = (DayOfWeek) currentDay; 

      switch(dayOfWeek) 
      { 
       case DayOfWeek.Monday: 
       case DayOfWeek.Tuesday: 
       case DayOfWeek.Wednesday: 
       case DayOfWeek.Thursday: 
       case DayOfWeek.Friday: 

        // is a week day 
        isWeekDay = true; 

        // required 
        break; 

       default: 

        // is a NOT week day 
        isWeekDay = true; 

        // required 
        break; 
      } 

      if (isWeekDay) 
      { 
       // increment the value 
       businessDaysInMonth++; 
      } 
     } 

     // return value 
     return businessDaysInMonth; 
    } 

    private int GetDaysInMonth() 
    { 
     // initial value 
     int daysInMonth = 0; 

     switch(DateTime.Now.Month) 
     { 
      case 1: 
      case 3: 
      case 5: 
      case 7: 
      case 8: 
      case 10: 
      case 12: 

       daysInMonth = 31; 

       // required; 
       break; 

      case 2: 

       daysInMonth = 28; 

       // to do (leap year) 
       bool isLeapYear = IsLeapYear(); 

       // if isLeapYear 
       if (isLeapYear) 
       { 
        // set to 29 
        daysInMonth = 29; 
       } 

       // required 
       break; 

      case 4: 
      case 6: 
      case 9: 
      case 11: 

       daysInMonth = 30; 

       // required; 
       break; 
     } 

     // return value 
     return daysInMonth; 
    } 

    private bool IsLeapYear() 
    { 
     // initial value 
     bool isLeapYear = false; 

     int year = DateTime.Now.Year; 

     //determine the year 
     switch(year) 
     { 
      case 2012: 
      case 2016: 
      case 2020: 
      // to do: Go as far out as you need to 

       // set to true 
       isLeapYear = true; 

       // required 
       break; 
     } 

     // return value 
     return isLeapYear; 
    } 
+0

Vous n'avez pas besoin de mettre en œuvre 'vous GetDaysInMonth'. Le framework contient déjà 'DateTime.DaysInMonth'. Votre logique de l'année bissextile est moche (elle duplique aussi le code de l'infrastructure). Vous pouvez utiliser l'opérateur modulo pour calculer la gravité pour des années arbitraires. – CodesInChaos

+0

Je l'ai écrit en 5 minutes pour exprimer de comment le faire, pas le moyen le plus efficace de le faire. – user1054326

Questions connexes