Código de C sharp - Calculo de Días Con Excepción Sab-Dom C#

<<>>
Imágen de perfil

Calculo de Días Con Excepción Sab-Dom C#gráfica de visualizaciones


C sharp

estrellaestrellaestrellaestrellaestrella(2)
Actualizado el 22 de Mayo del 2017 por Jose Francisco (Publicado el 21 de Mayo del 2017)
1.160 visualizaciones desde el 21 de Mayo del 2017. Una media de 70 por semana
En esta oportunidad, les enseñare como calcular la cantidad de días hábiles que hay entre dos fechas, sin contar los Sábados y Domingos. Aún no toma los días feriados pero lo estoy desarrollando a ver como nos queda.

1.0.1.32
estrellaestrellaestrellaestrellaestrella(2)

Actualizado el 23 de Julio del 2017 (Publicado el 21 de Mayo del 2017)gráfica de visualizaciones de la versión: 1.0.1.32
1.161 visualizaciones desde el 21 de Mayo del 2017. Una media de 70 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
Primero crearemos una clase (en mi caso la llame Negocio_Vacaciones, puesto que es una app de nomina)
 
public class Negocio_Vacaciones
{
public int DiasDisfrute(DateTime Fecha_Inicio, DateTime Fecha_Fin)
    {
        int DiasNormales;
        int DiasHabiles;
        int Contador;
        DateTime Aux_Fecha;
        int DiaSemana;
 
        string Aux_FechaInicio;
        string Aux_FechaFin;
 
        DiasNormales = 0;
        DiaSemana = 0;
        DiasHabiles = 0;
        Contador = 0;
        DiasNormales = Convert.ToInt32((Fecha_Fin - Fecha_Inicio).TotalDays);
        Aux_FechaInicio = Fecha_Inicio.ToString("dd-MM-yyyy");
        Aux_FechaFin = Fecha_Fin.ToString("dd-MM-yyyy");
        if (Aux_FechaInicio != Aux_FechaFin)
        {
            if (DiasNormales == 2)
            {
                DiasHabiles = 1;
            }
            else
            {
                while (Contador < DiasNormales)
                {
                    Aux_Fecha = Fecha_Inicio.AddDays(Contador);
                    DiaSemana = GetDayWeek(Aux_Fecha);
                    if ((DiaSemana != 5) && (DiaSemana != 6))
                    {
                        DiasHabiles = DiasHabiles + 1;
                    }
                    Contador = Contador + 1;
                }
            }
        }
        else
        {
            DiasHabiles = 0;
        }
        return DiasHabiles;
    }
 
 
private int GetDayWeek(DateTime Fecha)
    {
        int Dia=0;
        switch (Fecha.Date.DayOfWeek.ToString())
        {
            case "Monday":
                Dia = 0;
                break;
            case "Tuesday":
                Dia = 1;
                break;
            case "Wednesday":
                Dia = 2;
                break;
            case "Thursday":
                Dia = 3;
                break;
            case "Friday":
                Dia = 4;
                break;
            case "Saturday":
                Dia = 5;
                break;
            case "Sunday":
                Dia = 6;
                break;
        }
        return Dia;
    }
 
}



Comentarios sobre la versión: 1.0.1.32 (2)

Agustin
21 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Por supuesto que este codigo esta pésimamente mal escrito:

- Da rodeos completamente innecesarios convirtiendo datos entre diferentes formatos para luego hacer un if: El método GetDayWeek() convierte de System.DayOfWeek a string y luego a int. Esto no tiene ningun sentido.

- Compara fechas usando su representacion en string en lugar de comparar los datos en si mismos. Esto es muy propenso a errores y debe evitarse siempre que sea posible.

- Es innecesariamente rebuscado (lleno de ifs y whiles) en lugar de usar las ventajas del lenguaje C#.

- No cumple con las convenciones de nombres establecidas en C#, que indican que tanto las variables locales como los parámetros de los métodos se deben nombrar usando camelCase.

La forma correcta e idiomática de escribir este código, usando la última versión de C# es esta:

public int DiasDisfrute(DateTime fechaInicio, DateTime fechaFin)
{
var diasHabiles = new[]
{
DayOfWeek.Monday,
DayOfWeek.Tuesday,
DayOfWeek.Wednesday,
DayOfWeek.Thursday,
DayOfWeek.Friday,
};

IEnumerable<DateTime> RangoDeFechas()
{
var currentDate = fechaInicio;
while (currentDate < fechaFin)
{
yield return currentDate;
currentDate = currentDate.AddDays(1);
}
}

return RangoDeFechas().Count(x => diasHabiles.Contains(x.DayOfWeek));
}

Aqui un ejemplo del mismo que se puede probar online: http://csharppad.com/gist/52676f7407ec685f1a6cb80e79a781c1

Explicación:

- Se declara el array diasHabiles con los dias de la semana que consideramos hábiles.

- El bloque iterador RangoDeFechas() devuelve la colección de todas las fechas entre fechaInicio y fechaFin.

- se devuelve el Count() de elementos de dicha colección cuyo dia de la semana esté incluido en el array.

Así de simple y sencillo, en 3 simples pasos. Aprendamos a usar C# correctamente.
Responder
Imágen de perfil
Jose Francisco
22 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Gracias.! muy bueno, pero cada quien desarrolla a su manera.! las criticas deben ser constructivas no destructivas, muy bueno tu código mas sencillo, a diferencia del mio que dure horas pensando, pero como mucho dije LO HICE.
Responder

Comentar la versión: 1.0.1.32

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s4000