top of page
Search

Zeller's Congruence - Coded in Python

  • Writer: davidcarew19
    davidcarew19
  • Dec 13, 2024
  • 3 min read
#!C:\Python37\python
#        1         2         3         4         5         6       #...567890123456789012345678901234567890123456789012345678901234567890
#  C:\Users\DCarew\py3dev\ZellersC_1arg.py
#     Compute day-of-the-week for given date using Zeller's Congruence
#     #       URL ptr wikipedia reference to Zeller's formula is: 
#       https://en.wikipedia.org/wiki/Zeller%27s_congruence
#      Note: date m/b YYYYMMDD format, one cmd-line arg: -dYYYYMMDD
#     Note2: there is simpler way to do this using python library 
#            import code (i.e. calendar and (perhaps) datetime). This
#            is by way of experimenting w/ Zeller's Congruence.
#
#    SLIME TRAIL (chg history)
#    
#    DATE       WHO     DESCRIPTION
#    =========  ======= =============================================
#    08/22/2023 ?seeURL (hoping it works 'cuz it w/b hell to dbug
#                       otherwise...)
#                       https://stackoverflow.com/questions/
#                       46002047/day-of-the-week-using-zellers-
#                       congruence-python-3  
#    10/25/2023 carew   Modify to accept single command-line arg in 
#                       yyyymmdd format
#    12/13/2024         Modify for 70-char width (to fit neatly in  
#                       a Wix weblog post...
#--------------------------------------------------------------------#TODO:
#  
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import argparse
import datetime
import sys

def valid_date(d):
    """ 
    Use datetime library validation to check arg passed in 
    """
    try:
        fulldt = datetime.datetime.strptime(d, "%Y%m%d")
    except ValueError:
        msg = "Not a valid date: '{0}'.".format(d)
        raise argparse.ArgumentTypeError(msg)
    return d
# main starts here
parser = argparse.ArgumentParser(prog='ZellersC_1arg', 
description="Find calendar day-of-week for 'any' date yrs 1583-9999")
parser.add_argument('-d', "--yyyymmdd", 
        help="Zeller's Congruence Date - format YYYYMMDD ",
        required=True,        
        type=valid_date)
args = parser.parse_args()    
yyyymmdd_dt = args.yyyymmdd

# diagnostics below -commented out
# print(" year is: ", yyyymmdd_dt[:4])   
# print("month is: ", yyyymmdd_dt[4:6])
# print("  day is: ", yyyymmdd_dt[6:8])
year = int(yyyymmdd_dt[:4])
if year not in range(1583, 10000):
    print("Year is out of allowed range 1583 - 9999.")
    print("Please enter valid date arg as -dYYYYMMDD")
    sys.exit(2)

month = int(yyyymmdd_dt[4:6])
if month not in range(1, 13):
    print("Month is out of allowed range 1 - 12.")
    print(" Enter valid date as -dYYYYMMDD")
    sys.exit(2)

if month == 1 or month == 2:
    month += 12
    year -= 1 
# adjust month, year numbers for the formula from wikipedia

day = int(yyyymmdd_dt[6:8])
if day not in range(1,32):
    print("day is not good value for of month (1 - 31). \
    Please enter date as digits -dYYYYMMDD ")
    sys.exit(2)

kay = int(year % 100)    
#             kay is K century number-- see Gregorian calendar: 
#             formula is in above wikipedia URL reference.

jay = int(year // 100)  
# jay is J zero-based century number. See 
# Wikipedia reference.  

#     Below is my code to execute the wikipedia formula:
result = (day + (13 * (month+1) // 5) + kay + (kay // 4) + \
          (jay // 4) - (2*jay))
result = result % 7  
#  print("result is: ",result)
weekday = {0:"Saturday", 1:"Sunday", 2:"Monday", 3:"Tuesday", \               4:"Wednesday", 5:"Thursday", 6:"Friday"}

# print("The day of the week for date " + yyyymmdd_dt + " is: " + \
#        weekday[int(result)] + ".")
#   ...more 'sophisticated' formatting below

print(f"The day of the week for date %4d-%2.2d-%2.2d is: \ {weekday[int(result)]}." % (year,month,day))


Copy the above code and paste it into Notepad (or any editor's blank buffer). Save the code under {whatever-name-you-wish}.py

Run the code using the python launcher "py". Here is an example showing that D-Day was a Tuesday:


$>py -3 ZellersC_narrow_1argp3v3.py -d 19440606

The day of the week for date 1944-06-06 is: Tuesday.


Note: the code is formatted in a terrible, squirrelly way, because Wix text entry is not ideal for entering code-- HOWEVER, I did carefully test it by extracting the source from the above code section, and for me it ran, in spite of non-attractive formatting.

 
 
 

Recent Posts

See All
Let's Hear it for BASIC

A few months ago, I wrote a routine program that displays the UNICODE (ASCII) values for the most common 128 characters. It is something that I have done many times as part of learning a new programm

 
 
 

Comments


  • Facebook
  • Twitter
  • LinkedIn

©2019 by DavidCarew. Proudly created with Wix.com

bottom of page