2010-04-21 40 views
6

Tengo un escenario en el que quiero encontrar la fecha al realizar una sesión de 8 días hábiles a partir de la fecha de hoy. Supongamos que si la fecha de hoy es el 21/04/10. Ahora quiero mostrar que la fecha sea el 04/09/10. Los fines de semana deben ser excluidos.¿Cómo calcular 8 días hábiles a partir de la fecha de hoy?

Por ejemplo. Si la fecha de hoy es 04/21/10

fines de semana: Restar sábado- 04/10/10, 04/17/10 domingo-04/11/10,04/18/10

El salida sale a ser 04/09/10.

Me gustaría hacer esto con C#.

Cualquier ayuda o sugerencia sería útil.

Gracias, Sumit

+7

¿Qué pasa con los días festivos? – Blorgbeard

Respuesta

0

Es muy estúpida algoritmo pero funcionará durante 8 días. Si el día de inicio es de lunes a miércoles (incluido), agregue días, de lo contrario . Más general es en bucle agregar un día y comprobar si es día hábil o no.

0

Hay sólo siete casos a considerar, por lo que sería calcular cuántos días reales para restar dependiendo del día de la semana, algo como esto (obviamente no es completa o probado):

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

Tendría que modificar esto para tener en cuenta los días festivos como @blorgbeard dijo anteriormente –

+0

Estoy de acuerdo en que para muchas aplicaciones no es suficiente manejar los fines de semana. Pero entendí que la pregunta era cómo hacer eso. Para manejar festividades públicas, potencialmente en muchas culturas diferentes, por supuesto son masivamente más complejas ... – Peter

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

utilizando Fluent DateTime proyecto en CodePlex.

4

Obviamente hay lotes de maneras de hacer esto, pero tal vez se diviertan un poco con los generadores. He usado métodos de extensión pero YMMV. Por lo tanto, determinar si es necesario hacer que el código cultureally conscientes (o lo que sea descriminator se requieren en función de sus necesidades), etc, etc

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

A continuación, utilice el generador DateTime para alimentar algunas expresiones 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)); 

se obtiene la imagen

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