Hoy me encontré con este post llamado "Calculate Business Days using LINQ" donde explican como usar C# y LINQ para de un rango de fechas obtener solo las fechas que son laborables, es decir excluir las fechas que caigan en sábado y domingo.
El código se muestra a continuación donde se haca primero una llamada al método GetAllDates y se le pasa una fecha inicial y otra final, después con Where de LINQ se evalúa cada fecha un método que regresa falso o verdadero si la fecha cae en fin de semana o no, obteniendo al fina un arreglo con las fechas laborables.
public static class BusinessDays | |
{ | |
public static bool WorkingDay(this DateTime date) | |
{ | |
return date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday; | |
} | |
/* this function is used only to collect the dates | |
we are not paying much attention of the implementation */ | |
public static List<DateTime> GetAlldates(DateTime start, DateTime end) | |
{ | |
List<DateTime> dates = new List<DateTime>(); | |
DateTime currLoopDate = start; | |
while (currLoopDate < end) | |
{ | |
dates.Add(currLoopDate); | |
currLoopDate = currLoopDate.AddDays(1); | |
} | |
return dates; | |
} | |
} | |
var dates = BusinessDays.GetAlldates(DateTime.Now, DateTime.Now.AddDays(7)); | |
int getBizDays = dates.Where(day => day.WorkingDay()).Count(); |
Después de revisarlo, me pregunte, que tan complicado es hacer lo mismo en Ruby. Después de unos minutos me di cuenta que es ridículamente simple hacer lo mismo que LINQ y C# en solo 1 linea de código.
A mi metodo wroking_days se le pasa una fecha inicial y una fecha final y como resultado tenemos una arreglo de fechas excluyendo las que caen en fin de semana.
def working_days(start_date, end_date) | |
days = [] | |
(start_date..end_date).each { |d| days << d if d.cwday < 6 } | |
days | |
end | |
working_days(Date.today, Date.today + 7).each{|x| puts x.to_s} |
3 comentarios:
public static IEnumerable GetWorkingDays(DateTime start, DateTime end)
{
return System.Linq.Enumerable.Range(0, end.Subtract(start).Days + 1)
.Where( i => start.AddDays(i).DayOfWeek == DayOfWeek.Sunday )
.Select(i => start.AddDays(i));
}
public static void Main (string[] args)
{
foreach( DateTime d in GetWorkingDays(DateTime.Now, DateTime.Now.AddDays(10)))
{
Console.WriteLine(d.ToShortDateString());
}
}
perdon ese start.AddDays(i).DayOfWeek era != en lugar de ==
Rene;
Yo tambien habia visto que se podia mejorar, de hecho hay una actualizacion al post de C# donde muestra otra opcion tambien con iEnumerable en lugar de List
Publicar un comentario