Calcular el día de la semana con C#

Hoy les traigo un sencillo ejemplo, y muy usado en C# y otros lenguajes de programación. Es una sencilla pregunta, pero la respuesta no es tan sencilla.

Que día de la semana cae el 20 de abril del 2020?

Que día de la semana será el 12 de agosto del 2011?

Estas respuestas sin la ayuda de la computadora solo algunos eruditos pueden responderlas (yo conozco a uno). El problema no es tan sencullo como dividir y hallar restos de división.

Primero hay que buscar una forma de guardar cuantos días tiene cada mes, teniendo en cuenta claro, si el año es bisiesto o no…

Recuerden que un año es bisiesto si es divisible entre 400 ó es divisible entre 4 y no entre 100.

Bueno, vamos a hacer un programa de consola, que primero le pida al usuario que entre una fecha válida, con su día, mes y año y luego imprimiremos en consola que día de la semana será o fue la fecha recibida.

Vamos al código:

using System;
 
namespace DiaDeLaSemana
{
   class Class1
   {
      //Esta es la aplicación de entrada
      static void Main()
      {
         while(true)
	 {
		//Pedimos que entre la fecha y validamos que
                //los datos sean correctos
                Console.WriteLine("Escribe una fecha"+'\n');
		Console.Write("Dia: ");
		int d = int.Parse(Console.ReadLine());
		if(d<=0) break;
		Console.Write("Mes: ");
		int m = int.Parse(Console.ReadLine());
		if(m<=0) break;
		Console.Write("Año: ");
		int a = int.Parse(Console.ReadLine());
		if(a<=0) break;
                //Creamos un array con los días de la semanas
		string[] days = {"Domingo", "Lunes", "Martes",
                "Miercoles", "Jueves", "Viernes", "Sabado"};
           //Esta es la respuesta, usando el método DayOfWeek()
	   Console.WriteLine("Ese dia es "+days[DayOfWeek(d,m,a)]);
	 }
    }
 
    public static int DayOfWeek(int day, int month, int year)
    {
	int[] mesCode = {0,6,2,2,5,0,3,5,1,4,6,2,4};
     int result = year%100 + (year%100)/4 + day + mesCode[month];
 
	if(year/100==17) result += 5;
	else if(year/100==18) result += 3;
	else if(year/100==19) result += 1;
	else if(year/100==20) result += 0;
	else if(year/100==21) result += -2;
	else if(year/100==22)  result += -4;
 
        //Vemos si es bisiesto y quitamos un día si
        //el mes es enero o febrero
	if(EsBisiesto(year) && (month==1 || month==2))
	    result += -1;	
 
        //Esto devuelve un número entre 0 y 7
        //que nos dá el día de la semana
	return result%7;
    }
 
    //Método para saber si un año es bisiesto
    private static bool EsBisiesto(int a)
    {
	return (a%4==0 && a%100!=0) || a%400==0;
    }
}
}

Interesante verdad? Pues ya saben algo nuevo, si quieren este método puede ser un poco más elegante y con menos código, piensen en alguna otra solución y la discutimos en los comentarios.

'\n'
Comparte este post:
  • Meneame
  • Digg
  • del.icio.us
  • Facebook
  • BarraPunto
  • Google Bookmarks
  • Reddit
  • Technorati
  • Wikio
  • LinkedIn
  • Netvibes
  • Bitacoras.com
  • Add to favorites
  • Diggita
  • email
  • MySpace
  • Twitter
7 Comentarios
  1. miaskyNo Gravatar | 27 Agosto 2009 a las 5:29

    ¿No se podría sustituir tu métoto DayOfWeek por el que viene por defecto en la clase DateTime de C#?

    DateTime fecha = new DateTime(year,month,day);
    fecha.DayOfWeek();
    //Método propio de C# que devuelve Monday Thuesday …. Sunday

    y ya estaría, con sólo 2 líneas de código, y bueno si quieres traducir los nombre sería alguna línea más de código.

    Un saludo.

  2. TomyNo Gravatar | 27 Agosto 2009 a las 15:47

    Miasky, claro que se podría hacer así, tienes razón, eso tendría que haberlo explicado después, pero el objetivo era que se conociera bien como funciona el método para calcular el día de la semana. O sea, ver esa clase por dentro. Gracias por tu comentario.

  3. miaskyNo Gravatar | 28 Agosto 2009 a las 3:56

    Ok, no hay problema ;)

  4. marbinNo Gravatar | 26 Noviembre 2009 a las 22:03

    Gracias men me salvaste de una…Eres Genial..Sigue asi

  5. JunXCosioNo Gravatar | 5 Diciembre 2009 a las 19:14

    DateTime fecha = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

    switch (fecha.DayOfWeek)
    {
    case DayOfWeek.Monday: Console.WriteLine(“Hoy es Lunes”); break;
    case DayOfWeek.Thursday: Console.WriteLine(“Hoy es Martes”); break;
    case DayOfWeek.Wednesday: Console.WriteLine(“Hoy es Miercoles”); break;
    case DayOfWeek.Tuesday: Console.WriteLine(“Hoy es Jueves”); break;
    case DayOfWeek.Friday: Console.WriteLine(“Hoy es Viernes”); break;
    case DayOfWeek.Saturday: Console.WriteLine(“Hoy es Sabado”); break;
    case DayOfWeek.Sunday: Console.WriteLine(“Hoy es Domingo”); break;
    }

    Console.ReadKey();

    Este pequeño codigo te dice en castellano el dia de la semana que es…

  6. davidNo Gravatar | 6 Marzo 2010 a las 16:03

    Yo apenas empiezo con turbo c y la verdad me encargaron un trabajo semejante.. me pidieron que escribiera un programa que calcule el numero de dias de un mes, dados los valores numéricos del mes y año… no se si me puedan ayudar con este problema, se que el que escribiste esta bien, pero no lo puedo modificar para sacar lo ke necesito :(
    gracias

  7. esta muy bueno esoNo Gravatar | 5 Agosto 2010 a las 10:47

    me podrian ayudar a ser un programa que calcule el valor en $ de la compra de un objeto que realize un cliente, aparte se le ofrece descuento dependiendo el numero de kilos que se vendan

    0-5 kilos 0 descuento
    5.01 – 10 12.5 descuento
    10.01 – en adelante 22.5 descuento

    si me pueden ayudar se los agradeceria

Escribe un comentario