Calcular el día de la semana con C#

Ago 2, 2009 Codigos C# Programacion 17 comentarios

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'

Compartir:

Relacionados

algunos artículos que te pueden interesar

17 comentarios

Forma parte de nuestra discusión y síguela de cerca

¿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.

Autor: miasky | Fecha: Ago 27, 2009.

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.

Autor: Tomy | Fecha: Ago 27, 2009.

Ok, no hay problema ;)

Autor: miasky | Fecha: Ago 28, 2009.

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

Autor: marbin | Fecha: Nov 26, 2009.

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…

Autor: JunXCosio | Fecha: Dic 5, 2009.

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

Autor: david | Fecha: Mar 6, 2010.

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

Autor: esta muy bueno eso | Fecha: Ago 5, 2010.

Excelente aportes . te pido que hagas un tutorial o informe de manejo de datos con c# . Como guardar los datos de una aplicacion en txt , en base de datos tipo access u otra . abrir, modificar, actualizar ,guardar y donde va el codigo para hacer consultas .
Espero que puedas hacerlo ya que no existe en la red algo con estas caracteristicas.

Saludos

Autor: Juan | Fecha: Nov 22, 2010.

Juan, me parece una buena idea… hace un tiempo hice algunos proyectos que necesitaban este tipo de manejo de datos. Estuve buscando en la red, y es verdad que no hay casi nada interesante, después que termine el próximo tutorial (árboles en C#) empezaré a trabajar en esto.

Autor: Tomy | Fecha: Nov 22, 2010.

porque este array
int[] mesCode = {0,6,2,2,5,0,3,5,1,4,6,2,4};

Autor: wili | Fecha: Mar 24, 2011.

Amigo si me podrías ayudar tengo que calcular con la duración de un curso (por horas ), y devolverme una fecha fin. Ejemplo: Le digo que el curso es de 180 horas, le digo que son (L,M,M,J,V,S), y le digo 6 horas por día pero domingo no trabajan, entonces esas horas no se cuentan estos seria con un checkbox, ¿Como lo podría hacer?

Autor: Andres | Fecha: Sep 19, 2011.

porque este array???

int [] mesCode={0,6,2,2,5,0,3,5,1,4,6,2,4};
y que onda con result=5; esos valores comos los usa???

Autor: v11 | Fecha: Feb 10, 2012.

@wili y @v11, Mayra hizo un excelente post explicando para que sirve el array mesCode y como usarlos, con ejemplos sobre este código:
http://mayraguilarm777.wordpress.com/2012/02/13/algoritmo-dia-semana/#comment-2

@Andres, solo tienes que trabajar con 2 arrays de tamaño 7 donde cada posición representa el día de la semana, y tendrá un valor true o false, dependiendo si ese día hay curso o no, luego en otro array de tamaño 7 puedes poner la cantidad de horas que dura el curso cada día, ya después puedes hacer un for hasta el total de horas del curso y calcular cuantos dias dura, o puedes buscar una formula directamente usando congruencias (ya esto es un tin más complicado)

@Juan, me parece muy buena idea, en estos días voy a escribir un post sobre eso.

Autor: Tomy | Fecha: Feb 13, 2012.

Muy bien explicado; ojala y pueda subir como elaborarlos en otra clase la cual llamara por medio de un objeto.
Thank’s…

Autor: @Shummon_warrior | Fecha: May 6, 2012.

Con que programa se puede compilar

Autor: andres roman | Fecha: Jun 17, 2013.

disculpen una pregunta como puedo hacer para que me lea la fecha de la maquina y que si es sabado y domingo me haga un descuento???

Autor: karen | Fecha: Sep 5, 2013.

He encontrado un menda que lo ha hecho más rápido: http://stackoverflow.com/a/22278311/3315914

Autor: Peter | Fecha: Mar 10, 2014.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.