# Python 日历相关的函数

```WEEKDAYS = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
#WEEKDAYS = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
MONTH_NAME = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

def get_month_days(year, month):
global MONTH_DAYS;
if(month==2):
if(((year%4 == 0) and (year%100 != 0)) or (year%400 == 0)):
return 29
else:
return 28
else:
return(MONTH_DAYS[month]);

def get_syear_days(syear):
if(((syear%4 == 0) and (syear%100 != 0)) or (syear%400 == 0)):
return 366
else:
return 365

def get_week_of_syear(syear, smonth, sday):
weekday = get_weekday(syear, 1, 1)
first_week_days = 7 - weekday
day_of_syear = get_day_of_syear(syear, smonth, sday)
week_of_syear = (day_of_syear - first_week_days) / 7
if ((day_of_syear - first_week_days) % 7): week_of_syear += 1
week_of_syear += 1  # the first week.
return week_of_syear

def get_day_of_syear(syear, smonth, sday):
""" get given day's number of sun year """
days = 0
for i in range(1, smonth):
days += get_month_days(syear, i)
days += sday
return days

def get_weekday(month, day, year):
if(month == 1 or month == 2):
month += 12; year -= 1;
# w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
y = year % 100;
c = int(math.floor(year/100));
m = month;
d = day;
#echo "y - c - m - d\n";
w = int (y+ math.floor(y/4) + math.floor(c/4) -2*c+ math.floor(26*(m+1)/10) +d-1)
#echo w . "\n";
w = w % 7;
if (w < 0):
w += 7;
return w;
#weekdays = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]

def get_constellation(month, day):
dates = (21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22)
constellations = [
"Capricorn(the Goat)",
"Aquarius(the Water Carrier)",
"Pisces(the Fishes)",
"Aries(the Ram)",
"Taurus(the Bull)",
"Gemini(the Twins)",
"Cancer(the Crab)",
"Leo(the Lion)",
"Virgo(the Virgin)",
"Libra(the Scales)",
"Scorpio(the Scorpion)",
"Sagittarius(the Archer)",
"Capricorn(the Goat)"
]
if day < dates[month-1]:
return constellations[month-1]
else:
return constellations[month]

def get_month_days(year, month):
MONTH_DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];
if(month==2):
if(((year%4 == 0) and (year%100 != 0)) or (year%400 == 0)):
return 29
else:
return 28
else:
return(MONTH_DAYS[month]);

def gen_year_calendar(year):
year_table = ""
year_table += "<table class=\"year\">";
global MONTH_NAME;
month_per_line = 3
for i in range(1,13):
month_str = MONTH_NAME[i]
if(i%month_per_line == 1): year_table += "<tr>";
year_table += '<td><table><tr><td class="month_name"><h2><a href=\"%d-%s.html\">%s %d</a></h2></tr>' % (year, month_str, month_str, year);
year_table += "<tr><td>";
year_table += gen_month_calendar(year, i);
year_table += "</td></tr></table></td>";
if(i%month_per_line == 0): year_table += "</tr>";
year_table += "</table>";
return year_table;

def gen_month_calendar(year, month):
global WEEKDAYS;
weekday = get_weekday(month, 1, year);
table_str = "<table class=\"month\"><tr>";
for w in WEEKDAYS:
table_str += "<th>%s</th>" % w[:3]
table_str += "</tr>";
table_str += "<tr>";
for j in range(weekday):
table_str += "<td>&nbsp;</td>";
month_days = get_month_days(year, month);
tr_num = 0
for day in range(1, month_days+1):
j = day + weekday - 1
if(j%7 == 0 and j!=0):
table_str += "<tr>";
tr_num += 1
table_str += '<td class="%s"><a href="%d-%s-%d.html">%d</a></td>' % \
(WEEKDAYS[j%7][:3], year, MONTH_NAME[month], day, day)
if(j%7 == 6):
table_str += "</tr>";
if table_str[-5:] != "</tr>":
table_str += "</tr>";
while tr_num < 5:
table_str += '<tr><td colspan="7">&nbsp</td></tr>'
tr_num += 1
table_str += "</table>";
return table_str;

def gen_day_calendar(year, month, day):
day_html = ""
days_of_year = get_day_of_syear(year, month, day)
week_of_syear = get_week_of_syear(year, month, day)
days_to_end = get_syear_days(year) - days_of_year
day_html += '<table class="day">'
day_html += '<tr><td>Days of Week:</td><td>%s</td></tr>' % ( WEEKDAYS[get_weekday(month, day, year)] )
day_html += '<tr><td>Days of Year:</td><td>%d</td></tr>' % ( days_of_year)
day_html += '<tr><td>Week of Year:</td><td>%d</td></tr>' % ( week_of_syear)
day_html += '<tr><td>Days to End of Year:</td><td>%d</td></tr>' % (days_to_end)
day_html += '<tr><td>Constellation:</td><td>%s</td></tr>' % (get_constellation(month, day))
day_html += '<tr><td>Today In History:</td><td><a target="_blank" href="http://todayinhistory.pythonclub.org/%s-%d.html">%s %d History</a></td></tr>' % (MONTH_NAME[month], day, MONTH_NAME[month], day)
day_html += '</table>';
return day_html```