-
Notifications
You must be signed in to change notification settings - Fork 1
/
datecalc.py
61 lines (57 loc) · 1.75 KB
/
datecalc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class DATECALC:
@staticmethod
def daycount(d):
if d['m'] == 2:
# a year has a leap day if:
# it is a multiple of 4, except if:
# it is a multiple of 100,
# except for multiples of 400
# mul4 and ((not mul100) or mul400)
# the or makes %400 override %100 when it is true
# this is not true before 1750, 1700 and below are just every 4 years
if d['y'] % 4 == 0:
if d['y'] <= 1700:
return 29
else:
if d['y'] % 100 != 0 or d['y'] % 400 == 0:
return 29
else:
return 28
else:
return 28
elif d['m'] in [1,3,5,7,8,10,12]:
return 31
else:
assert d['m'] in [4,6,9,11]
return 30
def date_tuple(d):
return d['y'], d['m'], d['d']
# a, b of type {'m', 'd', 'y' : int}
def date_before(a, b):
return date_tuple(a) < date_tuple(b)
# needed to convert to a datecalc-style dict
def date_to_nums(d):
d['m'] = ['January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December']\
.index(d['m'])
d['d'] = int(d['d'].rstrip('stndrdth')) # remove letters from 1st, 2nd, 3rd, 4th
d['y'] = int(d['y'])
return d
@app.route('/test/daycount')
def test_daycount():
import subprocess
r = []
yield '<pre>'
for y in range(1,4000):
calput = subprocess.check_output("cal feb " + str(y), shell=True)
dc = DATECALC.daycount({'m':2,'d':1,'y':y})
adc = 29 if b"29" in calput.split(b"\n", 1)[1] else 28
if dc != adc:
yield "<span style='color:red'>"
tup = (y, dc, adc, dc == adc)
yield FLASK_UTIL.ESCAPE(json.dumps(tup)) + '\n'
if dc != adc:
yield calput.decode('utf8')
yield "</span>"
return '</pre>'