diff options
author | Raymond Hettinger <python@rcn.com> | 2002-12-25 16:37:19 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2002-12-25 16:37:19 (GMT) |
commit | e11b510a5b35378572aca75dae7e9174756da5da (patch) | |
tree | 56503c8fcfc28cb5a9c4beb7ee6cb6abce16c0a7 /Lib/calendar.py | |
parent | 80475bb4d21d1e5ddbb9eb0042adb1113052b38a (diff) | |
download | cpython-e11b510a5b35378572aca75dae7e9174756da5da.zip cpython-e11b510a5b35378572aca75dae7e9174756da5da.tar.gz cpython-e11b510a5b35378572aca75dae7e9174756da5da.tar.bz2 |
SF 658405: calendar.py to rely on the datetime module instead of the time
module.
The code is shorter, more readable, faster, and dramatically increases the
range of acceptable dates.
Also, used the floor division operator in leapdays().
Diffstat (limited to 'Lib/calendar.py')
-rw-r--r-- | Lib/calendar.py | 26 |
1 files changed, 8 insertions, 18 deletions
diff --git a/Lib/calendar.py b/Lib/calendar.py index 3f9b7ba..365ca26 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -5,10 +5,7 @@ default, these calendars have Monday as the first day of the week, and Sunday as the last (the European convention). Use setfirstweekday() to set the first day of the week (0=Monday, 6=Sunday).""" -# Revision 2: uses functions from built-in time module - -# Import functions and variables from time module -from time import localtime, mktime, strftime +import datetime __all__ = ["error","setfirstweekday","firstweekday","isleap", "leapdays","weekday","monthrange","monthcalendar", @@ -35,7 +32,7 @@ class _localized_month: self.format = format def __getitem__(self, i): - data = [strftime(self.format, (2001, j, 1, 12, 0, 0, 1, 1, 0)) + data = [datetime.date(2001, j, 1).strftime(self.format) for j in range(1, 13)] data.insert(0, "") return data[i] @@ -49,7 +46,7 @@ class _localized_day: def __getitem__(self, i): # January 1, 2001, was a Monday. - data = [strftime(self.format, (2001, 1, j+1, 12, 0, 0, j, j+1, 0)) + data = [datetime.date(2001, 1, j+1).strftime(self.format) for j in range(7)] return data[i] @@ -89,14 +86,12 @@ def leapdays(y1, y2): Assume y1 <= y2.""" y1 -= 1 y2 -= 1 - return (y2/4 - y1/4) - (y2/100 - y1/100) + (y2/400 - y1/400) + return (y2//4 - y1//4) - (y2//100 - y1//100) + (y2//400 - y1//400) def weekday(year, month, day): """Return weekday (0-6 ~ Mon-Sun) for year (1970-...), month (1-12), day (1-31).""" - secs = mktime((year, month, day, 0, 0, 0, 0, 0, 0)) - tuple = localtime(secs) - return tuple[6] + return datetime.date(year, month, day).weekday() def monthrange(year, month): """Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for @@ -213,17 +208,12 @@ def calendar(year, w=0, l=0, c=_spacing): return s[:-l] + '\n' EPOCH = 1970 +_EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal() + def timegm(tuple): """Unrelated but handy function to calculate Unix timestamp from GMT.""" year, month, day, hour, minute, second = tuple[:6] - assert year >= EPOCH - assert 1 <= month <= 12 - days = 365*(year-EPOCH) + leapdays(EPOCH, year) - for i in range(1, month): - days = days + mdays[i] - if month > 2 and isleap(year): - days = days + 1 - days = days + day - 1 + days = datetime.date(year, month, day).toordinal() - _EPOCH_ORD hours = days*24 + hour minutes = hours*60 + minute seconds = minutes*60 + second |