#!/usr/bin/python3

from datetime import datetime, timedelta


def getJDN(month, day, year = None, julian = False):	# JDN at at noon on the day
	if year == None:
		year = datetime.now().year
	month, year = (month, year) if month > 2 else (month+12, year-1)
	a = year//100
	b = 2 - a + a//4 if not julian else 0
	if year < 0:
		year += 1
	JDN = int(365.25 * year - (0 if year>0 else .75)) + int(30.6001 * (month + 1)) + day + 1720995 + b
	return JDN

def JDN2date(jdn, julian = False):	# JDN at the previous noon
	jd = jdn + 0.5					# useless here
	Z,F = int(jdn), jdn-int(jdn)
	
	if julian:
		A = Z
	else:
		alpha = (Z-1867216.25)//36524.25
		A = Z + 1 + alpha - alpha//4
	B = A + 1524
	C = int((B-122.1)/365.25)
	D = int(365.25 * C)
	E = int((B - D)/30.6001)
	day = int(B - D - int(30.6001 * E) + F)		# note floor on the day
	month = E - (1 if E < 13.5 else 13)
	year = C - (4716 if month > 2.5 else 4715)
	return month, day, year 

def dow(month, day, year = None, julian = False):
	if year == None:
		year = datetime.now().year
	return (getJDN(month, day, year, julian) + 1) % 7

