Project tutorial
Day of the Week calculator

Day of the Week calculator © GPL3+

Program takes day, month, and year and outputs the day of the week. Designed to be basic template to be merged into any project.

  • 2,151 views
  • 0 comments
  • 1 respect

Components and supplies

Apps and online services

About this project

This is a very basic function to take a date and produce the day of the week.

It is intentionally basic in order to be parsed into other sketches for use.

No schematic involved. Simply use the Arduino IDE's serial monitor.

(note, if you use a time module that utilizes a 1 through 7 day of the week value or if the values do not line up, ensure you make the appropriate changes.)

Code

Day of the week calculatorC/C++
Basic function utilizing Arduino.
#include <math.h>
/*
  Day of the Week calculator

  Accurate as far back as September 14, 1752.  
  In 1752, England was the last country to
  skip days (11 days) in order to sync up 
  calendars as the world finished shifting from 
  the Julian calendar to the Gregorian calendar.
  (Well...technically England was not the last 
  to change.  Russian calendars did not shift to 
  the Gregorian calendar until 1918, and Greece 
  shifted in 1923)
  
  Any date entered prior to this shift may 
  result in incorrect day of the week calculations

  Using formula:
  DoW value = (d + m + y + (y/4) + c)mod7

  where
  d = day
  m = month value (as per table below)
  y = two digit year
  c = century value (as per table below)

  - - - - - - - - - - - - - - - - - - - - 
 | Century |  Month        | DoW | Value |
 | - - - - | - - - - - - - | - - | - - - | 
 |    20   |  Jan/Oct      | Sat |   0   |
 |    19   |  May          | Sun |   1   |
 |    n/a  |  *Feb/Aug     | Mon |   2   |
 |    22   |  Feb/Mar/Nov  | Tue |   3   |
 |    n/a  |  Jun          | Wed |   4   |
 |    21   |  Sep/Dec      | Thu |   5   |
 |    n/a  |  *Jan/Apr/Jul | Fri |   6   |
  - - - - - - - - - - - - - - - - - - - -

 Note:  For Jan and Feb, if the year is a 
 leap year, use the *Jan or *Feb.  Otherwise 
 use regular Jan or Feb. 
 (see Leap Year note below)

 When all values are entered into formula
 (all values are absolute, so whatever you get
 for y/4, drop the decimal), divide by 7.  
 The remainder (0-6) goes back to the chart 
 to determine Day of the week.

 Leap Year Note:
 A leap year is determined true if:
 -1- The year is evenly divisible by 4, but not divisible by 100
 or
 -2- The year is evenly divisible by 400.

 Created by Eric Sitler
 30August2016

*/

int m;          // Month Entry
int d;          // Day Entry
int yy;         // Last 2 digits of the year (ie 2016 would be 16)
int yyyy;       // Year Entry
int c;          // Century (ie 2016 would be 20)
int mTable;     // Month value based on calculation table
int SummedDate; // Add values combined in prep for Mod7 calc
int DoW;        // Day of the week value (0-6)
int leap;       // Leap Year or not
int cTable;     // Century value based on calculation table

void setup() 
{
  Serial.begin(9600);
  Serial.println("Day of the week calculator");
  Serial.println("Enter date in numbers, mm/dd/yyyy)");
}

void loop() {
  // if there's any serial available, read it
  while (Serial.available() > 0) 
  {

    m = Serial.parseInt();
    d = Serial.parseInt();
    yyyy = Serial.parseInt();

    Serial.print(m);
    Serial.print("/");
    Serial.print(d);
    Serial.print("/");
    Serial.print(yyyy);

    // Leap Year Calculation
    if((fmod(yyyy,4) == 0 && fmod(yyyy,100) != 0) || (fmod(yyyy,400) == 0))
    { leap = 1; }
    else 
    { leap = 0; }

    // Limit results to year 1900-2299 (to save memory)
    while(yyyy > 2299)
    { yyyy = yyyy - 400; }
    while(yyyy < 1900)
    { yyyy = yyyy + 400; }

    // Calculating century
    c = yyyy/100;

    // Calculating two digit year
    yy = fmod(yyyy, 100);

    // Century value based on Table
    if(c == 19) { cTable = 1; }
    if(c == 20) { cTable = 0; }
    if(c == 21) { cTable = 5; }
    if(c == 22) { cTable = 3; }

    // Jan and Feb calculations affected by leap years
    if(m == 1)
    { if(leap == 1) { mTable = 6; }
      else          { mTable = 0; }}
    if(m == 2)
    { if(leap == 1) { mTable = 2; }
      else          { mTable = 3; }}
    // Other months not affected and have set values
    if(m == 10) { mTable = 0; }
    if(m == 8) { mTable = 2; }
    if(m == 3 || m == 11) { mTable = 3; }
    if(m == 4 || m == 7) { mTable = 6; }
    if(m == 5) { mTable = 1; }
    if(m == 6) { mTable = 4; }
    if(m == 9 || m == 12) { mTable = 5; }

    // Enter the data into the formula
    SummedDate = d + mTable + yy + (yy/4) + cTable;
    
    // Find remainder
    DoW = fmod(SummedDate,7);  

    // Output result
    Serial.print(" = ");

    // Remainder determines day of the week
    if(DoW == 0) { Serial.println("Saturday"); }
    if(DoW == 1) { Serial.println("Sunday"); }
    if(DoW == 2) { Serial.println("Monday"); }
    if(DoW == 3) { Serial.println("Tuesday"); }
    if(DoW == 4) { Serial.println("Wednesday"); }
    if(DoW == 5) { Serial.println("Thursday"); }
    if(DoW == 6) { Serial.println("Friday"); }

  }
}

Comments

Similar projects you might like

Simple UNO calculator

Project tutorial by Joprp05

  • 13,339 views
  • 2 comments
  • 15 respects

Chug Meter for St. Patrick's Day by Circuito.io

Project tutorial by circuito.io team

  • 8,949 views
  • 9 comments
  • 29 respects

3-Bit Binary Calculator Using Arduino Uno

Project showcase by 22warehamD

  • 5,299 views
  • 9 comments
  • 13 respects

MKR1000 Message of the Day

Project showcase by Metonymy

  • 1,880 views
  • 0 comments
  • 1 respect

Valentines Day Idea - Days Spent Together Counter (Photo)

Project tutorial by LiamCamaraCooper

  • 1,153 views
  • 3 comments
  • 6 respects
Add projectSign up / Login