es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calcular el número exacto de semanas para un rango de fechas.

Una persona está involucrada en diferentes trabajos durante diferentes periodos de tiempo que comenzarán el lunes y terminarán el viernes de la siguiente manera. De lunes a viernes se considerará como 1 semana. Cualquier semana que se superponga se considerará como 1 semana.

A continuación, se presentan los escenarios:

JSON:

"AssignedEngagementdate":[
    {"Startdate":"01/03/2022","Enddate":"01/07/2022"},
    {"Startdate":"01/10/2022","Enddate":"01/14/2022"},
    {"Startdate":"01/10/2022","Enddate":"01/21/2022"},
    {"Startdate":"02/14/2022","Enddate":"02/18/2022"}
]

Aquí necesito encontrar el número de semanas asignadas a esta persona, y debe ser 4, ya que una semana del 10 de enero al 14 de febrero se superpone en 2 trabajos.

¿Cómo puedo hacer esto en C# utilizando LINQ? Estaba intentando obtener la fecha de inicio mínima y la fecha de finalización máxima de la lista, y luego encontrar la diferencia y convertirla en el número de semanas, pero no ha dado el resultado real ya que las fechas asignadas no son consistentes.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para encontrar el número de semanas asignadas por la persona en C# usando LINQ, podemos seguir estos pasos:

    1. Definir una función para calcular el número de semanas entre dos fechas, teniendo en cuenta cualquier semana superpuesta:
    private static int GetWeeks(DateTime start, DateTime end)
    {
        int days = (int)(end - start).TotalDays + 1;
        int weeks = days / 7;
        int remainder = days % 7;
    
        if (remainder > 0 && start.DayOfWeek <= end.DayOfWeek)
            weeks++;
    
        return weeks;
    }
    

    Esta función toma dos valores DateTime que representan las fechas de inicio y finalización de un compromiso, y devuelve el número de semanas asignadas para ese compromiso.

    1. Analizar las fechas de compromiso asignadas desde la cadena JSON en una lista de rangos de DateTime:
    var assignedEngagementDates = JArray.Parse(json)
        .Select(x => new
        {
            StartDate = DateTime.Parse((string)x["Startdate"]),
            EndDate = DateTime.Parse((string)x["Enddate"])
        })
        .ToList();
    

    Este código utiliza la clase JArray del paquete Newtonsoft.Json para analizar la cadena JSON en una secuencia de objetos que representan fechas de inicio y finalización. Luego, la secuencia se convierte en una lista para facilitar su manipulación.

    1. Calcular el número total de semanas asignadas iterando sobre la lista de compromisos y sumando el número de semanas para cada uno:
    int totalWeeks = assignedEngagementDates
        .Select(x => GetWeeks(x.StartDate, x.EndDate))
        .Sum();
    

    Este código utiliza LINQ para seleccionar el número de semanas para cada compromiso utilizando la función GetWeeks definida anteriormente, y luego suma los resultados para obtener el número total de semanas asignadas.

    Poniéndolo todo junto, el código se vería así:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Newtonsoft.Json.Linq;
    
    namespace Example
    {
        class Program
        {
            static void Main(string[] args)
            {
                string json = @"{
                    ""AssignedEngagementdate"":[
                        {""Startdate"":""01/03/2022"",""Enddate"":""01/07/2022""},
                        {""Startdate"":""01/10/2022"",""Enddate"":""01/14/2022""},
                        {""Startdate"":""01/10/2022"",""Enddate"":""01/21/2022""},
                        {""Startdate"":""02/14/2022"",""Enddate"":""02/18/2022""}
                    ]
                }";
    
                var assignedEngagementDates = JArray.Parse(json)
                    .Select(x => new
                    {
                        StartDate = DateTime.Parse((string)x["Startdate"]),
                        EndDate = DateTime.Parse((string)x["Enddate"])
                    })
                    .ToList();
    
                int totalWeeks = assignedEngagementDates
                    .Select(x => GetWeeks(x.StartDate, x.EndDate))
                    .Sum();
    
                Console.WriteLine($"Total semanas asignadas: {totalWeeks}");
            }
    
            static int GetWeeks(DateTime start, DateTime end)
            {
                int days = (int)(end - start).TotalDays + 1;
                int weeks = days / 7;
                int remainder = days % 7;
    
                if (remainder > 0 && start.DayOfWeek <= end.DayOfWeek)
                    weeks++;
    
                return weeks;
            }
        }
    }
    

    Cuando se ejecuta, este programa imprime “Total semanas asignadas: 4” como se espera.

Comments are closed.