]>
Commit | Line | Data |
---|---|---|
1 | # Name: CDate.py | |
2 | # Purpose: Date and Calendar classes | |
3 | # | |
4 | # Author: Lorne White (email: lwhite1@planet.eon.net) | |
5 | # | |
6 | # Created: | |
7 | # Version 0.2 1999/11/08 | |
8 | # Licence: wxWindows license | |
9 | #---------------------------------------------------------------------------- | |
10 | ||
11 | import time | |
12 | ||
13 | Month = {2: 'February', 3: 'March', None: 0, 'July': 7, 11: | |
14 | 'November', 'December': 12, 'June': 6, 'January': 1, 'September': 9, | |
15 | 'August': 8, 'March': 3, 'November': 11, 'April': 4, 12: 'December', | |
16 | 'May': 5, 10: 'October', 9: 'September', 8: 'August', 7: 'July', 6: | |
17 | 'June', 5: 'May', 4: 'April', 'October': 10, 'February': 2, 1: | |
18 | 'January', 0: None} | |
19 | ||
20 | # Number of days per month (except for February in leap years) | |
21 | mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
22 | ||
23 | # Full and abbreviated names of weekdays | |
24 | day_name = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] | |
25 | day_abbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', ] | |
26 | ||
27 | # Return number of leap years in range [y1, y2) | |
28 | # Assume y1 <= y2 and no funny (non-leap century) years | |
29 | ||
30 | def leapdays(y1, y2): | |
31 | return (y2+3)/4 - (y1+3)/4 | |
32 | ||
33 | # Return 1 for leap years, 0 for non-leap years | |
34 | def isleap(year): | |
35 | return year % 4 == 0 and (year % 100 <> 0 or year % 400 == 0) | |
36 | ||
37 | def FillDate(val): | |
38 | s = str(val) | |
39 | if len(s) < 2: | |
40 | s = '0' + s | |
41 | return s | |
42 | ||
43 | ||
44 | def julianDay(year, month, day): | |
45 | b = 0L | |
46 | year, month, day = long(year), long(month), long(day) | |
47 | if month > 12L: | |
48 | year = year + month/12L | |
49 | month = month%12 | |
50 | elif month < 1L: | |
51 | month = -month | |
52 | year = year - month/12L - 1L | |
53 | month = 12L - month%12L | |
54 | if year > 0L: | |
55 | yearCorr = 0L | |
56 | else: | |
57 | yearCorr = 3L | |
58 | if month < 3L: | |
59 | year = year - 1L | |
60 | month = month + 12L | |
61 | if year*10000L + month*100L + day > 15821014L: | |
62 | b = 2L - year/100L + year/400L | |
63 | return (1461L*year - yearCorr)/4L + 306001L*(month + 1L)/10000L + day + 1720994L + b | |
64 | ||
65 | ||
66 | def TodayDay(): | |
67 | date = time.localtime(time.time()) | |
68 | year = date[0] | |
69 | month = date[1] | |
70 | day = date[2] | |
71 | julian = julianDay(year, month, day) | |
72 | daywk = dayOfWeek(julian) | |
73 | daywk = day_name[daywk] | |
74 | return(daywk) | |
75 | ||
76 | def FormatDay(value): | |
77 | date = FromFormat(value) | |
78 | daywk = DateCalc.dayOfWeek(date) | |
79 | daywk = day_name[daywk] | |
80 | return(daywk) | |
81 | ||
82 | def FromJulian(julian): | |
83 | julian = long(julian) | |
84 | if (julian < 2299160L): | |
85 | b = julian + 1525L | |
86 | else: | |
87 | alpha = (4L*julian - 7468861L)/146097L | |
88 | b = julian + 1526L + alpha - alpha/4L | |
89 | c = (20L*b - 2442L)/7305L | |
90 | d = 1461L*c/4L | |
91 | e = 10000L*(b - d)/306001L | |
92 | day = int(b - d - 306001L*e/10000L) | |
93 | if e < 14L: | |
94 | month = int(e - 1L) | |
95 | else: | |
96 | month = int(e - 13L) | |
97 | if month > 2: | |
98 | year = c - 4716L | |
99 | else: | |
100 | year = c - 4715L | |
101 | year = int(year) | |
102 | return year, month, day | |
103 | ||
104 | def dayOfWeek(julian): | |
105 | return int((julian + 1L)%7L) | |
106 | ||
107 | def daysPerMonth(month, year): | |
108 | ndays = mdays[month] + (month == 2 and isleap(year)) | |
109 | return ndays | |
110 | ||
111 | class now: | |
112 | def __init__(self): | |
113 | self.date = time.localtime(time.time()) | |
114 | self.year = self.date[0] | |
115 | self.month = self.date[1] | |
116 | self.day = self.date[2] | |
117 | ||
118 | class Date: | |
119 | def __init__(self, year, month, day): | |
120 | self.julian = julianDay(year, month, day) | |
121 | self.month = month | |
122 | self.year = year | |
123 | self.day_of_week = dayOfWeek(self.julian) | |
124 | self.days_in_month = daysPerMonth(self.month, self.year) | |
125 |