Mercurial > p > roundup > code
annotate date.py @ 0:5e92642cd1f8
Initial import of code
Currently version 1.0.2 but with the 1.0.3 changes as given in the
CHANGES file. Is about ready for a 1.0.3 release.
[[This repository is actually a lift into git made in October 2011 of
code history originally kept in CVS and later in Subversion. This
import marks the point at which the original private CVS moved to
public CVS on SourceForge.
Due to technical problems with CVS and the CVS to Subversion
conversion tools, portions of the early history have somewhat garbled
metadata. Here and elsewhere in this repo, comments enclosed in curly
braces were added at the time of the git lift in an attempt to document
the problem.]]
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Thu, 19 Jul 2001 02:16:19 +0000 |
| parents | |
| children | 72a0ba086b3e |
| rev | line source |
|---|---|
|
0
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1 import time, re, calendar |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
2 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
3 class Date: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
4 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 As strings, date-and-time stamps are specified with the date in |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 international standard format (yyyy-mm-dd) joined to the time |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
7 (hh:mm:ss) by a period ("."). Dates in this form can be easily compared |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 and are fairly readable when printed. An example of a valid stamp is |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 "2000-06-24.13:03:59". We'll call this the "full date format". When |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
10 Timestamp objects are printed as strings, they appear in the full date |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
11 format with the time always given in GMT. The full date format is |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 always exactly 19 characters long. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
13 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 For user input, some partial forms are also permitted: the whole time |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 or just the seconds may be omitted; and the whole date may be omitted |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
16 or just the year may be omitted. If the time is given, the time is |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
17 interpreted in the user's local time zone. The Date constructor takes |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 care of these conversions. In the following examples, suppose that yyyy |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 is the current year, mm is the current month, and dd is the current day |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 of the month; and suppose that the user is on Eastern Standard Time. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 "2000-04-17" means <Date 2000-04-17.00:00:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 "01-25" means <Date yyyy-01-25.00:00:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 "2000-04-17.03:45" means <Date 2000-04-17.08:45:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 "08-13.22:13" means <Date yyyy-08-14.03:13:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 "11-07.09:32:43" means <Date yyyy-11-07.14:32:43> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 "14:25" means <Date yyyy-mm-dd.19:25:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 "8:47:11" means <Date yyyy-mm-dd.13:47:11> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 "." means "right now" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 The Date class should understand simple date expressions of the form |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 stamp + interval and stamp - interval. When adding or subtracting |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 intervals involving months or years, the components are handled |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 separately. For example, when evaluating "2000-06-25 + 1m 10d", we |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 first add one month to get 2000-07-25, then add 10 days to get |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 or 41 days). |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 Example usage: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 >>> Date(".") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 <Date 2000-06-26.00:34:02> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 >>> _.local(-5) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 "2000-06-25.19:34:02" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 >>> Date(". + 2d") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 <Date 2000-06-28.00:34:02> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 >>> Date("1997-04-17", -5) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 <Date 1997-04-17.00:00:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 >>> Date("01-25", -5) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 <Date 2000-01-25.00:00:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 >>> Date("08-13.22:13", -5) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
51 <Date 2000-08-14.03:13:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 >>> Date("14:25", -5) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 <Date 2000-06-25.19:25:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 isDate = 1 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 def __init__(self, spec='.', offset=0, set=None): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 """Construct a date given a specification and a time zone offset. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 'spec' is a full date or a partial form, with an optional |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
61 added or subtracted interval. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 'offset' is the local time zone offset from GMT in hours. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 """ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 if set is None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 self.set(spec, offset=offset) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 else: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 self.year, self.month, self.day, self.hour, self.minute, \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 self.second, x, x, x = set |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 self.offset = offset |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 def applyInterval(self, interval): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 ''' Apply the interval to this date |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 t = (self.year + interval.year, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 self.month + interval.month, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 self.day + interval.day, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 self.hour + interval.hour, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 self.minute + interval.minute, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 self.second + interval.second, 0, 0, 0) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 self.year, self.month, self.day, self.hour, self.minute, \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 self.second, x, x, x = time.gmtime(calendar.timegm(t)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
83 def __add__(self, other): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
84 """Add an interval to this date to produce another date.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 t = (self.year + other.sign * other.year, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 self.month + other.sign * other.month, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
87 self.day + other.sign * other.day, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
88 self.hour + other.sign * other.hour, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 self.minute + other.sign * other.minute, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 self.second + other.sign * other.second, 0, 0, 0) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 return Date(set = time.gmtime(calendar.timegm(t))) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
93 # XXX deviates from spec to allow subtraction of dates as well |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 def __sub__(self, other): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
95 """ Subtract: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 1. an interval from this date to produce another date. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 2. a date from this date to produce an interval. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 """ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 if other.isDate: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
100 # TODO this code will fall over laughing if the dates cross |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 # leap years, phases of the moon, .... |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
102 a = calendar.timegm((self.year, self.month, self.day, self.hour, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
103 self.minute, self.second, 0, 0, 0)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
104 b = calendar.timegm((other.year, other.month, other.day, other.hour, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
105 other.minute, other.second, 0, 0, 0)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 diff = a - b |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 if diff < 0: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
108 sign = -1 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 diff = -diff |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
110 else: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
111 sign = 1 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
112 S = diff%60 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 M = (diff/60)%60 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 H = (diff/(60*60))%60 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 if H>1: S = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
116 d = (diff/(24*60*60))%30 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
117 if d>1: H = S = M = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 m = (diff/(30*24*60*60))%12 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
119 if m>1: H = S = M = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 y = (diff/(365*24*60*60)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 if y>1: d = H = S = M = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 return Interval((y, m, d, H, M, S), sign=sign) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
123 t = (self.year - other.sign * other.year, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
124 self.month - other.sign * other.month, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 self.day - other.sign * other.day, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 self.hour - other.sign * other.hour, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 self.minute - other.sign * other.minute, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 self.second - other.sign * other.second, 0, 0, 0) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
129 return Date(set = time.gmtime(calendar.timegm(t))) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
130 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 def __cmp__(self, other): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 """Compare this date to another date.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
133 for attr in ('year', 'month', 'day', 'hour', 'minute', 'second'): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
134 r = cmp(getattr(self, attr), getattr(other, attr)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 if r: return r |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 return 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
137 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
138 def __str__(self): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
139 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
140 return time.strftime('%Y-%m-%d.%T', (self.year, self.month, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
141 self.day, self.hour, self.minute, self.second, 0, 0, 0)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 def pretty(self): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
144 ''' print up the date date using a pretty format... |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
145 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
146 return time.strftime('%e %B %Y', (self.year, self.month, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 self.day, self.hour, self.minute, self.second, 0, 0, 0)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
148 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
149 def set(self, spec, offset=0, date_re=re.compile(r''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
150 (((?P<y>\d\d\d\d)-)?((?P<m>\d\d)-(?P<d>\d\d))?)? # yyyy-mm-dd |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 (?P<n>\.)? # . |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d))?)? # hh:mm:ss |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
153 (?P<o>.+)? # offset |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 ''', re.VERBOSE)): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
155 ''' set the date to the value in spec |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 m = date_re.match(spec) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 if not m: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 raise ValueError, 'Not a date spec: [[yyyy-]mm-dd].[[h]h:mm[:ss]] [offset]' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 info = m.groupdict() |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
161 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
162 # get the current date/time using the offset |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
163 y,m,d,H,M,S,x,x,x = time.gmtime(time.time()) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
164 ts = calendar.timegm((y,m,d,H+offset,M,S,0,0,0)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 self.year, self.month, self.day, self.hour, self.minute, \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 self.second, x, x, x = time.gmtime(ts) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 if info['m'] is not None and info['d'] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 self.month = int(info['m']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 self.day = int(info['d']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 if info['y'] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 self.year = int(info['y']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 self.hour = self.minute = self.second = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
174 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 if info['H'] is not None and info['M'] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 self.hour = int(info['H']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 self.minute = int(info['M']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 if info['S'] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 self.second = int(info['S']) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
180 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
181 if info['o']: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
182 self.applyInterval(Interval(info['o'])) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
184 def __repr__(self): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 return '<Date %s>'%self.__str__() |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 def local(self, offset): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
188 """Return this date as yyyy-mm-dd.hh:mm:ss in a local time zone.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
189 t = (self.year, self.month, self.day, self.hour + offset, self.minute, |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
190 self.second, 0, 0, 0) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
191 self.year, self.month, self.day, self.hour, self.minute, \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
192 self.second, x, x, x = time.gmtime(calendar.timegm(t)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
193 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 class Interval: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
196 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
197 Date intervals are specified using the suffixes "y", "m", and "d". The |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 suffix "w" (for "week") means 7 days. Time intervals are specified in |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
199 hh:mm:ss format (the seconds may be omitted, but the hours and minutes |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
200 may not). |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
201 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
202 "3y" means three years |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 "2y 1m" means two years and one month |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
204 "1m 25d" means one month and 25 days |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
205 "2w 3d" means two weeks and three days |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
206 "1d 2:50" means one day, two hours, and 50 minutes |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
207 "14:00" means 14 hours |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
208 "0:04:33" means four minutes and 33 seconds |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
209 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
210 Example usage: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
211 >>> Interval(" 3w 1 d 2:00") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
212 <Interval 22d 2:00> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
213 >>> Date(". + 2d") - Interval("3w") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
214 <Date 2000-06-07.00:34:02> |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
215 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
216 isInterval = 1 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
217 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
218 def __init__(self, spec, sign=1): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
219 """Construct an interval given a specification.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
220 if type(spec) == type(''): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
221 self.set(spec) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
222 else: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
223 self.sign = sign |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
224 self.year, self.month, self.day, self.hour, self.minute, \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
225 self.second = spec |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
226 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
227 def __cmp__(self, other): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
228 """Compare this interval to another interval.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
229 for attr in ('year', 'month', 'day', 'hour', 'minute', 'second'): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
230 r = cmp(getattr(self, attr), getattr(other, attr)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
231 if r: return r |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
232 return 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
233 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
234 def __str__(self): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
235 """Return this interval as a string.""" |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
236 sign = {1:'+', -1:'-'}[self.sign] |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
237 l = [sign] |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
238 if self.year: l.append('%sy'%self.year) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
239 if self.month: l.append('%sm'%self.month) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
240 if self.day: l.append('%sd'%self.day) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
241 if self.second: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
242 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
243 elif self.hour or self.minute: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
244 l.append('%d:%02d'%(self.hour, self.minute)) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
245 return ' '.join(l) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
246 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
247 def set(self, spec, interval_re = re.compile(''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
248 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
249 (?P<s>[-+])? # + or - |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
250 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
251 ((?P<y>\d+\s*)y)? # year |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
252 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
253 ((?P<m>\d+\s*)m)? # month |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
254 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
255 ((?P<w>\d+\s*)w)? # week |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
256 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
257 ((?P<d>\d+\s*)d)? # day |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
258 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
259 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d))?)? # time |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
260 \s* |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
261 ''', re.VERBOSE)): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
262 ''' set the date to the value in spec |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
263 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
264 self.year = self.month = self.week = self.day = self.hour = \ |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
265 self.minute = self.second = 0 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
266 self.sign = 1 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
267 m = interval_re.match(spec) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
268 if not m: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
269 raise ValueError, 'Not an interval spec: [+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS]' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
270 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
271 info = m.groupdict() |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
272 for group, attr in {'y':'year', 'm':'month', 'w':'week', 'd':'day', |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
273 'H':'hour', 'M':'minute', 'S':'second'}.items(): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
274 if info[group] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
275 setattr(self, attr, int(info[group])) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
276 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
277 if self.week: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
278 self.day = self.day + self.week*7 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
279 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
280 if info['s'] is not None: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
281 self.sign = {'+':1, '-':-1}[info['s']] |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
282 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
283 def __repr__(self): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
284 return '<Interval %s>'%self.__str__() |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
285 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
286 def pretty(self, threshold=('d', 5)): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
287 ''' print up the date date using one of these nice formats.. |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
288 < 1 minute |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
289 < 15 minutes |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
290 < 30 minutes |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
291 < 1 hour |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
292 < 12 hours |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
293 < 1 day |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
294 otherwise, return None (so a full date may be displayed) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
295 ''' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
296 if self.year or self.month or self.day > 5: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
297 return None |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
298 if self.day > 1: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
299 return '%s days'%self.day |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
300 if self.day == 1 or self.hour > 12: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
301 return 'yesterday' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
302 if self.hour > 1: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
303 return '%s hours'%self.hour |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
304 if self.hour == 1: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
305 if self.minute < 15: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
306 return 'an hour' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
307 quart = self.minute/15 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
308 if quart == 2: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
309 return '1 1/2 hours' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
310 return '1 %s/4 hours'%quart |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
311 if self.minute < 1: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
312 return 'just now' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
313 if self.minute == 1: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
314 return '1 minute' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
315 if self.minute < 15: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
316 return '%s minutes'%self.minute |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
317 quart = self.minute/15 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
318 if quart == 2: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
319 return '1/2 an hour' |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
320 return '%s/4 hour'%quart |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
321 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
322 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
323 def test(): |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
324 intervals = (" 3w 1 d 2:00", " + 2d", "3w") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
325 for interval in intervals: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
326 print '>>> Interval("%s")'%interval |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
327 print `Interval(interval)` |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
328 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
329 dates = (".", "2000-06-25.19:34:02", ". + 2d", "1997-04-17", "01-25", |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
330 "08-13.22:13", "14:25") |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
331 for date in dates: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
332 print '>>> Date("%s")'%date |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
333 print `Date(date)` |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
334 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
335 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00")) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
336 for date, interval in sums: |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
337 print '>>> Date("%s") + Interval("%s")'%(date, interval) |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
338 print `Date(date) + Interval(interval)` |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
339 |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
340 if __name__ == '__main__': |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
341 test() |
|
5e92642cd1f8
Initial import of code
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
342 |
