Encontrar el día de la semana para una fecha dada

Escribe una función que calcule el día de la semana para cualquier fecha en particular en el pasado o en el futuro. Una aplicación típica es calcular el día de la semana en que nació alguien o ocurrió algún otro evento especial. 
 

La siguiente es una función simple sugerida por Sakamoto, Lachman, Keith y Craver para calcular el día. La siguiente función devuelve 0 para el domingo, 1 para el lunes, etc. 
 

Understanding the Maths:

14/09/1998
dd=14
mm=09
yyyy=1998 //non-leap year

Step 1: Informations to be remembered.
 Magic Number Month array.
 For Year: {0,3,3,6,1,4,6,2,5,0,3,5}
 DAY array starting from 0-6: {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}
 Century Year Value: 1600-1699 = 6
      1700-1799 = 4
      1800-1899 = 2
      1900-1999 = 0
      2000-2099 = 6..

Step 2: Calculations as per the steps
 
 Last 2 digits of the year:  98
 Divide the above by 4:     24
 Take the date(dd):      14
 Take month value from array: 5 (for September month number 9)
 Take century year value:  0  ( 1998 is in the range 1900-1999 thus 0)
          -----
 Sum:        141
 
 Divide the Sum by 7 and get the remainder: 141 % 7 = 1
 
 Check the Day array starting from index 0: Day[1] = Monday

**If leap year it will be the remainder-1

C++

/* A program to find day of a given date */
#include <bits/stdc++.h>
using namespace std;
 
int dayofweek(int d, int m, int y)
{
    static int t[] = { 0, 3, 2, 5, 0, 3,
                       5, 1, 4, 6, 2, 4 };
    y -= m < 3;
    return ( y + y / 4 - y / 100 +
             y / 400 + t[m - 1] + d) % 7;
}
 
// Driver Code
int main()
{
    int day = dayofweek(30, 8, 2010);
    cout << day;
 
    return 0;
}
 
// This is code is contributed
// by rathbhupendra

C

/* A program to find day of a given date */
#include<stdio.h>
 
int dayofweek(int d, int m, int y)
{
    static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
    y -= m < 3;
    return ( y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
 
/* Driver function to test above function */
int main()
{
    int day = dayofweek(30, 8, 2010);
    printf ("%d", day);
 
    return 0;
}

Java

/*This code will return the string value and the exact date
 * both for leap and non leap years*/
import java.util.*;
class FindDay {
    static int dd;
    static int mm;
    static int yyyy;
    FindDay(int dd, int mm, int yyyy)
    {
        this.dd = dd;
        this.mm = mm;
        this.yyyy = yyyy;
    }
    static int checkLeap(int y)
    {
        if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
            return 1;
        else
            return 0;
    }
    static void calculate()
    {
 
        // Checking Leap year. If true then 1 else 0.
        int flag_for_leap = checkLeap(yyyy);
 
        /*Declaring and initialising the given informations
         * and arrays*/
        String day[] = { "Sunday",    "Monday",   "Tuesday",
                         "Wednesday", "Thursday", "Friday",
                         "Saturday" };
        int m_no[] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };
 
        /*Generalised check to find any Year Value*/
        int j;
        if ((yyyy / 100) % 2 == 0) {
            if ((yyyy / 100) % 4 == 0)
                j = 6;
            else
                j = 2;
        }
        else {
            if (((yyyy / 100) - 1) % 4 == 0)
                j = 4;
            else
                j = 0;
        }
 
        /*THE FINAL FORMULA*/
        int total = (yyyy % 100) + ((yyyy % 100) / 4) + dd
                    + m_no[mm - 1] + j;
        if (flag_for_leap == 1) {
            if ((total % 7) > 0)
                System.out.println(day[(total % 7) - 1]);
            else
                System.out.println(day[6]);
        }
        else
            System.out.println(day[(total % 7)]);
    }
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        /*Take input in string format and then convert to
         * integer values*/
        String date = sc.next();
        String[] values = date.split("/");
        new FindDay(Integer.parseInt(values[0]),
                    Integer.parseInt(values[1]),
                    Integer.parseInt(values[2]));
        calculate();
    }
}
/*Contributed and written by Aniket Dey*/

Python3

# Python3 program to find day
# of a given date
 
def dayofweek(d, m, y):
    t = [ 0, 3, 2, 5, 0, 3,
          5, 1, 4, 6, 2, 4 ]
    y -= m < 3
    return (( y + int(y / 4) - int(y / 100)
             + int(y / 400) + t[m - 1] + d) % 7)
 
# Driver Code
day = dayofweek(30, 8, 2010)
print(day)
 
# This code is contributed by Shreyanshi Arun.

C#

// C# program to find day of a given date
using System;
 
class GFG {
     
    static int dayofweek(int d, int m, int y)
    {
        int []t = { 0, 3, 2, 5, 0, 3, 5,
                            1, 4, 6, 2, 4 };
        y -= (m < 3) ? 1 : 0;
         
        return ( y + y/4 - y/100 + y/400
                         + t[m-1] + d) % 7;
    }
     
    // Driver Program to test above function
    public static void Main()
    {
        int day = dayofweek(30, 8, 2010);
         
        Console.Write(day);
    }
}
 
// This code is contributed by Sam007.

PHP

<?php
// PHP program to find
// day of a given date
function dayofweek($d, $m, $y)
{
    static $t = array(0, 3, 2, 5, 0, 3,
                      5, 1, 4, 6, 2, 4);
    $y -= $m < 3;
    return ($y + $y / 4 - $y / 100 +
            $y / 400 + $t[$m - 1] + $d) % 7;
}
 
// Driver Code
$day = dayofweek(30, 8, 2010);
echo $day;
 
// This code is contributed by mits.
?>

Javascript

<script>
 
// Javascript program to find day of a given date
 
function dayofweek(d, m, y)
{
    let t = [ 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 ];
    y -= (m < 3) ? 1 : 0;
    return ( y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
 
// Driver Code
 
    let day = dayofweek(30, 8, 2010);
    document.write(Math.round(day));
 
</script>

Salida: 1 (lunes)

Complejidad de tiempo: O(1)

Complejidad espacial: O(1)

Consulte esto para obtener una explicación de la función anterior.
Referencias: 
http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week
Este artículo fue compilado por Dheeraj Jain y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *