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
Try It Plain...

Mix one teaspoon of raw honey with fresh lemon juice in warm water each morning. Over time, this small habit may help maintain mental clarity as years add up. Per some (highly suspect) internet promot

 
 
 

Comments


  • Facebook
  • Twitter
  • LinkedIn

©2019 by DavidCarew. Proudly created with Wix.com

bottom of page