2010-04-21 30 views
6

Ho uno scenario in cui voglio trovare la data sottotitolando 8 giorni lavorativi dalla data di oggi. Supponiamo che la data odierna sia il 24/04/10. Ora voglio mostrare la data del 04/09/10. I weekend dovrebbero essere esclusi.Come calcolare 8 giorni lavorativi dalla data odierna?

Per esempio. Se la data di oggi è 04/21/10

Fine settimana Sottrarre: il sabato 04/10/10 04/17/10 domenica-04/11/10,04/18/10

Il la produzione uscirà il 04/09/10.

Mi piacerebbe farlo con C#.

Qualsiasi aiuto o suggerimento sarebbe utile.

Grazie, Sumit

+7

E i giorni festivi? – Blorgbeard

risposta

0

E 'molto stupido algoritmo ma funzionerà per 8 giorni. Se il giorno di inizio è lunedì-mercoledì (incl.), Aggiungere giorni, oppure . Più generale è in loop aggiungere un giorno e controllare è giorno lavorativo o meno.

0

Ci sono solo sette casi da considerare, quindi vorrei calcolare quanti giorni effettivi per sottrarre a seconda del giorno della settimana, qualcosa di simile (ovviamente non completa o testata):

switch (dayOfWeek) 
{ 
    case DayOfWeek.Monday : 
    case DayOfWeek.Tuesday : 
    case DayOfWeek.Wednesday : 
     return 12; 
    case DayOfWeek.Thursday : 
    case DayOfWeek.Friday : 
    case DayOfWeek.Saturday : 
     return 10; 
    case DayOfWeek.Sunday : 
     return 11; 
} 
+0

Dovresti modificare questo aspetto per tenere conto delle festività pubbliche come @blorgbeard ha detto sopra –

+0

Concordo sul fatto che per molte applicazioni non è sufficiente gestire solo i fine settimana. Ma ho capito che la domanda era come farlo. Gestire le festività pubbliche, potenzialmente in molte culture diverse, sono ovviamente molto più complesse ... – Peter

0
var desiredDate = DateTime.Now.SubtractBusinessDays(8); 

utilizzando Fluent DateTime progetto su CodePlex.

4

Ci sono ovviamente lotti di di modi per farlo, ma forse un po 'di divertimento con i generatori. Ho usato i metodi di estensione ma YMMV. Quindi, determinare se è necessario per rendere il codice cultureally a conoscenza (o qualsiasi altra cosa descriminator si richiede a seconda delle esigenze) ecc ecc

public static class DateTimeExtensions 
{ 
    public static IEnumerable<DateTime> Forwards(this DateTime dateTime) 
    { 
     return dateTime.Forwards(TimeSpan.FromDays(1)); 
    } 

    public static IEnumerable<DateTime> Forwards(this DateTime dateTime, TimeSpan span) 
    { 
     while (true) 
     { 
      yield return dateTime += span; 
     } 
    } 

    public static IEnumerable<DateTime> Backwards(this DateTime dateTime) 
    { 
     return dateTime.Backwards(TimeSpan.FromDays(1)); 
    } 

    public static IEnumerable<DateTime> Backwards(this DateTime dateTime, TimeSpan span) 
    { 
     return dateTime.Forwards(-span); 
    } 

    public static bool IsWorkingDay(this DateTime dateTime) 
    { 
     return dateTime.IsWorkingDay(Thread.CurrentThread.CurrentUICulture); 
    } 

    public static bool IsWorkingDay(this DateTime dateTime, CultureInfo culture) 
    { 
     return !dateTime.IsWeekend(culture) 
      && !dateTime.IsHoliday(culture); 
    } 

    public static bool IsWeekend(this DateTime dateTime) 
    { 
     return dateTime.IsWeekend(Thread.CurrentThread.CurrentUICulture); 
    } 

    public static bool IsWeekend(this DateTime dateTime, CultureInfo culture) 
    { 
     // TOOD: Make culturally aware 

     return dateTime.DayOfWeek == DayOfWeek.Saturday 
      || dateTime.DayOfWeek == DayOfWeek.Sunday; 
    } 

    public static bool IsHoliday(this DateTime dateTime) 
    { 
     return dateTime.IsHoliday(Thread.CurrentThread.CurrentUICulture); 
    } 

    public static bool IsHoliday(this DateTime dateTime, CultureInfo culture) 
    { 
     throw new NotImplementedException("TODO: Get some culture aware holiday data"); 
    } 
} 

Quindi utilizzare il generatore di DateTime per alimentare alcune espressioni LINQ:

 // Display every holiday from today until the end of the year 
     DateTime.Today.Forwards() 
      .TakeWhile(date => date.Year <= DateTime.Today.Year) 
      .Where(date => date.IsHoliday()) 
      .ForEach(date => Console.WriteLine(date)); 

si ottiene l'immagine

0
static DateTime GetBusinessDay(int days) 
    { 
     var dateTime = DateTime.Now; 
     bool run = true; 

     int i = 0; 

     while (run) 
     { 
      dateTime = dateTime.AddDays(1); 

      if (dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday) 
      { 
       continue; 
      } 

      i++; 

      if (i == 10) 
      { 
       run = false; 
      } 
     } 

     return dateTime; 
    } 
Problemi correlati