diff --git a/roundup/date.py b/roundup/date.py
index b9fd398c160b56d844192fb778bb890e928838b5..8f60a725e7eddfb56e73bea99a234b59931f6eda 100644 (file)
--- a/roundup/date.py
+++ b/roundup/date.py
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#
-# $Id: date.py,v 1.57 2003-11-19 22:53:15 jlgijsbers Exp $
+# $Id: date.py,v 1.60 2004-02-11 23:55:08 richard Exp $
-__doc__ = """
-Date, time and time interval handling.
+"""Date, time and time interval handling.
"""
+__docformat__ = 'restructuredtext'
import time, re, calendar, types
from i18n import _
care of these conversions. In the following examples, suppose that yyyy
is the current year, mm is the current month, and dd is the current day
of the month; and suppose that the user is on Eastern Standard Time.
+ Examples::
"2000-04-17" means <Date 2000-04-17.00:00:00>
"01-25" means <Date yyyy-01-25.00:00:00>
separately. For example, when evaluating "2000-06-25 + 1m 10d", we
first add one month to get 2000-07-25, then add 10 days to get
2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
- or 41 days).
+ or 41 days). Example usage::
- Example usage:
>>> Date(".")
<Date 2000-06-26.00:34:02>
>>> _.local(-5)
def __init__(self, spec='.', offset=0, add_granularity=0):
"""Construct a date given a specification and a time zone offset.
- 'spec' is a full date or a partial form, with an optional
- added or subtracted interval. Or a date 9-tuple.
- 'offset' is the local time zone offset from GMT in hours.
+ 'spec'
+ is a full date or a partial form, with an optional added or
+ subtracted interval. Or a date 9-tuple.
+ 'offset'
+ is the local time zone offset from GMT in hours.
"""
if type(spec) == type(''):
self.set(spec, offset=offset, add_granularity=add_granularity)
# now cope with under- and over-flow
# first do the time
while (second < 0 or second > 59 or minute < 0 or minute > 59 or
- hour < 0 or hour > 59):
+ hour < 0 or hour > 23):
if second < 0: minute -= 1; second += 60
elif second > 59: minute += 1; second -= 60
if minute < 0: hour -= 1; minute += 60
elif minute > 59: hour += 1; minute -= 60
if hour < 0: day -= 1; hour += 24
- elif hour > 59: day += 1; hour -= 24
+ elif hour > 23: day += 1; hour -= 24
# fix up the month so we're within range
while month < 1 or month > 12:
if month > 12: year += 1; month -= 12
# now do the days, now that we know what month we're in
- def get_mdays(year,month):
+ def get_mdays(year, month):
if month == 2 and calendar.isleap(year): return 29
else: return calendar.mdays[month]
-
- while month < 1 or month > 12 or day < 0 or day > get_mdays(year,month):
+
+ while month < 1 or month > 12 or day < 1 or day > get_mdays(year,month):
# now to day under/over
- if day < 0:
+ if day < 1:
# When going backwards, decrement month, then increment days
month -= 1
day += get_mdays(year,month)
return '%4d%02d%02d%02d%02d%02d'%(self.year, self.month,
self.day, self.hour, self.minute, self.second)
+ def timestamp(self):
+ ''' return a UNIX timestamp for this date '''
+ return calendar.timegm((self.year, self.month, self.day, self.hour,
+ self.minute, self.second, 0, 0, 0))
+
class Interval:
'''
Date intervals are specified using the suffixes "y", "m", and "d". The
return (sign, y, m, d, H, M, S)
class Range:
- """
- Represents range between two values
+ """Represents range between two values
Ranges can be created using one of theese two alternative syntaxes:
- 1. Native english syntax:
+ 1. Native english syntax::
+
[[From] <value>][ To <value>]
- Keywords "From" and "To" are case insensitive. Keyword "From" is optional.
- 2. "Geek" syntax:
- [<value>][; <value>]
+ Keywords "From" and "To" are case insensitive. Keyword "From" is
+ optional.
+
+ 2. "Geek" syntax::
+
+ [<value>][; <value>]
Either first or second <value> can be omitted in both syntaxes.
- Examples (consider local time is Sat Mar 8 22:07:48 EET 2003):
+ Examples (consider local time is Sat Mar 8 22:07:48 EET 2003)::
+
>>> Range("from 2-12 to 4-2")
<Range from 2003-02-12.00:00:00 to 2003-04-02.00:00:00>