annotate roundup/date.py @ 1669:17ec0bd6ecc5 maint-0.5

*** empty log message ***
author Richard Jones <richard@users.sourceforge.net>
date Wed, 18 Jun 2003 23:52:54 +0000
parents df49c7d31073
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # under the same terms as Python, so long as this copyright message and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # disclaimer are retained in their original form.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 #
1601
df49c7d31073 [SF#724626]
Richard Jones <richard@users.sourceforge.net>
parents: 1489
diff changeset
18 # $Id: date.py,v 1.40.2.2 2003-04-23 11:48:51 richard Exp $
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 __doc__ = """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 Date, time and time interval handling.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
24 import time, re, calendar, types
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 from i18n import _
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 class Date:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 As strings, date-and-time stamps are specified with the date in
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 international standard format (yyyy-mm-dd) joined to the time
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 (hh:mm:ss) by a period ("."). Dates in this form can be easily compared
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 and are fairly readable when printed. An example of a valid stamp is
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 "2000-06-24.13:03:59". We'll call this the "full date format". When
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 Timestamp objects are printed as strings, they appear in the full date
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 format with the time always given in GMT. The full date format is
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 always exactly 19 characters long.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 For user input, some partial forms are also permitted: the whole time
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 or just the seconds may be omitted; and the whole date may be omitted
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 or just the year may be omitted. If the time is given, the time is
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 interpreted in the user's local time zone. The Date constructor takes
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 care of these conversions. In the following examples, suppose that yyyy
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 is the current year, mm is the current month, and dd is the current day
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 of the month; and suppose that the user is on Eastern Standard Time.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 "2000-04-17" means <Date 2000-04-17.00:00:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 "01-25" means <Date yyyy-01-25.00:00:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 "2000-04-17.03:45" means <Date 2000-04-17.08:45:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 "08-13.22:13" means <Date yyyy-08-14.03:13:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 "11-07.09:32:43" means <Date yyyy-11-07.14:32:43>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 "14:25" means <Date yyyy-mm-dd.19:25:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 "8:47:11" means <Date yyyy-mm-dd.13:47:11>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 "." means "right now"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 The Date class should understand simple date expressions of the form
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 stamp + interval and stamp - interval. When adding or subtracting
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 intervals involving months or years, the components are handled
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 first add one month to get 2000-07-25, then add 10 days to get
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 or 41 days).
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 Example usage:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 >>> Date(".")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 <Date 2000-06-26.00:34:02>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 >>> _.local(-5)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 "2000-06-25.19:34:02"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 >>> Date(". + 2d")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 <Date 2000-06-28.00:34:02>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 >>> Date("1997-04-17", -5)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 <Date 1997-04-17.00:00:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 >>> Date("01-25", -5)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 <Date 2000-01-25.00:00:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 >>> Date("08-13.22:13", -5)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 <Date 2000-08-14.03:13:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 >>> Date("14:25", -5)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 <Date 2000-06-25.19:25:00>
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 The date format 'yyyymmddHHMMSS' (year, month, day, hour,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 minute, second) is the serialisation format returned by the serialise()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 method, and is accepted as an argument on instatiation.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 def __init__(self, spec='.', offset=0):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 """Construct a date given a specification and a time zone offset.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 'spec' is a full date or a partial form, with an optional
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 added or subtracted interval. Or a date 9-tuple.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 'offset' is the local time zone offset from GMT in hours.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 if type(spec) == type(''):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 self.set(spec, offset=offset)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 y,m,d,H,M,S,x,x,x = spec
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 ts = calendar.timegm((y,m,d,H+offset,M,S,0,0,0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 self.year, self.month, self.day, self.hour, self.minute, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 self.second, x, x, x = time.gmtime(ts)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 def addInterval(self, interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 ''' Add the interval to this date, returning the date tuple
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 # do the basic calc
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 sign = interval.sign
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 year = self.year + sign * interval.year
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 month = self.month + sign * interval.month
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 day = self.day + sign * interval.day
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 hour = self.hour + sign * interval.hour
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 minute = self.minute + sign * interval.minute
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 second = self.second + sign * interval.second
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 # now cope with under- and over-flow
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 # first do the time
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 while (second < 0 or second > 59 or minute < 0 or minute > 59 or
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 hour < 0 or hour > 59):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 if second < 0: minute -= 1; second += 60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 elif second > 59: minute += 1; second -= 60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 if minute < 0: hour -= 1; minute += 60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 elif minute > 59: hour += 1; minute -= 60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 if hour < 0: day -= 1; hour += 24
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 elif hour > 59: day += 1; hour -= 24
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 # fix up the month so we're within range
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 while month < 1 or month > 12:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 if month < 1: year -= 1; month += 12
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 if month > 12: year += 1; month -= 12
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 # now do the days, now that we know what month we're in
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 mdays = calendar.mdays
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 if month == 2 and calendar.isleap(year): month_days = 29
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 else: month_days = mdays[month]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 while month < 1 or month > 12 or day < 0 or day > month_days:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 # now to day under/over
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 if day < 0: month -= 1; day += month_days
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 elif day > month_days: month += 1; day -= month_days
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 # possibly fix up the month so we're within range
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 while month < 1 or month > 12:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 if month < 1: year -= 1; month += 12
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 if month > 12: year += 1; month -= 12
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 # re-figure the number of days for this month
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 if month == 2 and calendar.isleap(year): month_days = 29
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 else: month_days = mdays[month]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 return (year, month, day, hour, minute, second, 0, 0, 0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 def applyInterval(self, interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 ''' Apply the interval to this date
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 self.year, self.month, self.day, self.hour, self.minute, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 self.second, x, x, x = self.addInterval(interval)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 def __add__(self, interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 """Add an interval to this date to produce another date.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 return Date(self.addInterval(interval))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 # deviates from spec to allow subtraction of dates as well
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 def __sub__(self, other):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 """ Subtract:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 1. an interval from this date to produce another date.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 2. a date from this date to produce an interval.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 if isinstance(other, Interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 other = Interval(other.get_tuple())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 other.sign *= -1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 return self.__add__(other)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 assert isinstance(other, Date), 'May only subtract Dates or Intervals'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 # TODO this code will fall over laughing if the dates cross
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 # leap years, phases of the moon, ....
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 a = calendar.timegm((self.year, self.month, self.day, self.hour,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 self.minute, self.second, 0, 0, 0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 b = calendar.timegm((other.year, other.month, other.day,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 other.hour, other.minute, other.second, 0, 0, 0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 diff = a - b
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 if diff < 0:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 sign = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 diff = -diff
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 sign = -1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 S = diff%60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 M = (diff/60)%60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 H = (diff/(60*60))%60
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 if H>1: S = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 d = (diff/(24*60*60))%30
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 if d>1: H = S = M = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 m = (diff/(30*24*60*60))%12
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 if m>1: H = S = M = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 y = (diff/(365*24*60*60))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 if y>1: d = H = S = M = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 return Interval((y, m, d, H, M, S), sign=sign)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 def __cmp__(self, other):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 """Compare this date to another date."""
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 if other is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 for attr in ('year', 'month', 'day', 'hour', 'minute', 'second'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 if not hasattr(other, attr):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 r = cmp(getattr(self, attr), getattr(other, attr))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 if r: return r
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 def __str__(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format."""
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 return '%4d-%02d-%02d.%02d:%02d:%02d'%(self.year, self.month, self.day,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 self.hour, self.minute, self.second)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 def pretty(self, format='%d %B %Y'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 ''' print up the date date using a pretty format...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 Note that if the day is zero, and the day appears first in the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 format, then the day number will be removed from output.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 str = time.strftime(format, (self.year, self.month, self.day,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 self.hour, self.minute, self.second, 0, 0, 0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 # handle zero day by removing it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 if format.startswith('%d') and str[0] == '0':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 return ' ' + str[1:]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 return str
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 def set(self, spec, offset=0, date_re=re.compile(r'''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 (((?P<y>\d\d\d\d)-)?((?P<m>\d\d?)-(?P<d>\d\d?))?)? # yyyy-mm-dd
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 (?P<n>\.)? # .
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d))?)? # hh:mm:ss
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 (?P<o>.+)? # offset
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 ''', re.VERBOSE), serialised_re=re.compile(r'''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 (\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 ''', re.VERBOSE)):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 ''' set the date to the value in spec
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 m = serialised_re.match(spec)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 if m is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 # we're serialised - easy!
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 self.year, self.month, self.day, self.hour, self.minute, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 self.second = map(int, m.groups()[:6])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 return
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 # not serialised data, try usual format
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 m = date_re.match(spec)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 if m is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 raise ValueError, _('Not a date spec: [[yyyy-]mm-dd].'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 '[[h]h:mm[:ss]][offset]')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 info = m.groupdict()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 # get the current date as our default
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 y,m,d,H,M,S,x,x,x = time.gmtime(time.time())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 # override year, month, day parts
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 if info['m'] is not None and info['d'] is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 m = int(info['m'])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 d = int(info['d'])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 if info['y'] is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 y = int(info['y'])
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
256 # time defaults to 00:00:00 GMT - offset (local midnight)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
257 H = -offset
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
258 M = S = 0
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 # override hour, minute, second parts
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 if info['H'] is not None and info['M'] is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 H = int(info['H']) - offset
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 M = int(info['M'])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 S = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 if info['S'] is not None: S = int(info['S'])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 # now handle the adjustment of hour
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 ts = calendar.timegm((y,m,d,H,M,S,0,0,0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 self.year, self.month, self.day, self.hour, self.minute, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 self.second, x, x, x = time.gmtime(ts)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 if info.get('o', None):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 self.applyInterval(Interval(info['o']))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 def __repr__(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 return '<Date %s>'%self.__str__()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 def local(self, offset):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 """ Return this date as yyyy-mm-dd.hh:mm:ss in a local time zone.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 return Date((self.year, self.month, self.day, self.hour + offset,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 self.minute, self.second, 0, 0, 0))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 def get_tuple(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 return (self.year, self.month, self.day, self.hour, self.minute,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 self.second, 0, 0, 0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 def serialise(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 return '%4d%02d%02d%02d%02d%02d'%(self.year, self.month,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 self.day, self.hour, self.minute, self.second)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 class Interval:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 Date intervals are specified using the suffixes "y", "m", and "d". The
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 suffix "w" (for "week") means 7 days. Time intervals are specified in
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 hh:mm:ss format (the seconds may be omitted, but the hours and minutes
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 may not).
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 "3y" means three years
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 "2y 1m" means two years and one month
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301 "1m 25d" means one month and 25 days
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 "2w 3d" means two weeks and three days
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 "1d 2:50" means one day, two hours, and 50 minutes
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
304 "14:00" means 14 hours
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
305 "0:04:33" means four minutes and 33 seconds
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
307 Example usage:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308 >>> Interval(" 3w 1 d 2:00")
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
309 <Interval + 22d 2:00>
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 >>> Date(". + 2d") + Interval("- 3w")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 <Date 2000-06-07.00:34:02>
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
312 >>> Interval('1:59:59') + Interval('00:00:01')
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
313 <Interval + 2:00>
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
314 >>> Interval('2:00') + Interval('- 00:00:01')
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
315 <Interval + 1:59:59>
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
316 >>> Interval('1y')/2
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
317 <Interval + 6m>
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
318 >>> Interval('1:00')/2
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
319 <Interval + 0:30>
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
320
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
321 Interval arithmetic is handled in a couple of special ways, trying
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
322 to cater for the most common cases. Fundamentally, Intervals which
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
323 have both date and time parts will result in strange results in
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
324 arithmetic - because of the impossibility of handling day->month->year
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
325 over- and under-flows. Intervals may also be divided by some number.
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
326
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
327 Intervals are added to Dates in order of:
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 seconds, minutes, hours, years, months, days
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
330 Calculations involving months (eg '+2m') have no effect on days - only
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 days (or over/underflow from hours/mins/secs) will do that, and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 days-per-month and leap years are accounted for. Leap seconds are not.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 The interval format 'syyyymmddHHMMSS' (sign, year, month, day, hour,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 minute, second) is the serialisation format returned by the serialise()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 method, and is accepted as an argument on instatiation.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 TODO: more examples, showing the order of addition operation
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 def __init__(self, spec, sign=1):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 """Construct an interval given a specification."""
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 if type(spec) == type(''):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 self.set(spec)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 if len(spec) == 7:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 self.sign, self.year, self.month, self.day, self.hour, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 self.minute, self.second = spec
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
349 # old, buggy spec form
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350 self.sign = sign
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 self.year, self.month, self.day, self.hour, self.minute, \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 self.second = spec
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 def __cmp__(self, other):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 """Compare this interval to another interval."""
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 if other is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 for attr in ('year', 'month', 'day', 'hour', 'minute', 'second'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 if not hasattr(other, attr):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
361 r = cmp(getattr(self, attr), getattr(other, attr))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362 if r: return r
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 def __str__(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 """Return this interval as a string."""
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
367 l = []
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
368 if self.year: l.append('%sy'%self.year)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369 if self.month: l.append('%sm'%self.month)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
370 if self.day: l.append('%sd'%self.day)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
371 if self.second:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
373 elif self.hour or self.minute:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
374 l.append('%d:%02d'%(self.hour, self.minute))
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
375 if l:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
376 l.insert(0, {1:'+', -1:'-'}[self.sign])
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 return ' '.join(l)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
378
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
379 def __add__(self, other):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380 if isinstance(other, Date):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
381 # the other is a Date - produce a Date
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382 return Date(other.addInterval(self))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
383 elif isinstance(other, Interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
384 # add the other Interval to this one
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385 a = self.get_tuple()
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
386 as = a[0]
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
387 b = other.get_tuple()
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
388 bs = b[0]
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
389 i = [as*x + bs*y for x,y in zip(a[1:],b[1:])]
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
390 i.insert(0, 1)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
391 i = fixTimeOverflow(i)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
392 return Interval(i)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
393 # nope, no idea what to do with this other...
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
394 raise TypeError, "Can't add %r"%other
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
395
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
396 def __sub__(self, other):
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
397 if isinstance(other, Date):
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
398 # the other is a Date - produce a Date
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
399 interval = Interval(self.get_tuple())
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
400 interval.sign *= -1
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
401 return Date(other.addInterval(interval))
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
402 elif isinstance(other, Interval):
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
403 # add the other Interval to this one
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
404 a = self.get_tuple()
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
405 as = a[0]
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
406 b = other.get_tuple()
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
407 bs = b[0]
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
408 i = [as*x - bs*y for x,y in zip(a[1:],b[1:])]
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
409 i.insert(0, 1)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
410 i = fixTimeOverflow(i)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
411 return Interval(i)
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 # nope, no idea what to do with this other...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413 raise TypeError, "Can't add %r"%other
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
415 def __div__(self, other):
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
416 ''' Divide this interval by an int value.
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
417
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
418 Can't divide years and months sensibly in the _same_
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
419 calculation as days/time, so raise an error in that situation.
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
420 '''
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
421 try:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
422 other = float(other)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
423 except TypeError:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
424 raise ValueError, "Can only divide Intervals by numbers"
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
425
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
426 y, m, d, H, M, S = (self.year, self.month, self.day,
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
427 self.hour, self.minute, self.second)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
428 if y or m:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
429 if d or H or M or S:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
430 raise ValueError, "Can't divide Interval with date and time"
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
431 months = self.year*12 + self.month
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
432 months *= self.sign
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
433
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
434 months = int(months/other)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
435
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
436 sign = months<0 and -1 or 1
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
437 m = months%12
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
438 y = months / 12
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
439 return Interval((sign, y, m, 0, 0, 0, 0))
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
440
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
441 else:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
442 # handle a day/time division
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
443 seconds = S + M*60 + H*60*60 + d*60*60*24
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
444 seconds *= self.sign
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
445
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
446 seconds = int(seconds/other)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
447
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
448 sign = seconds<0 and -1 or 1
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
449 seconds *= sign
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
450 S = seconds%60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
451 seconds /= 60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
452 M = seconds%60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
453 seconds /= 60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
454 H = seconds%24
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
455 d = seconds / 24
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
456 return Interval((sign, 0, 0, d, H, M, S))
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
457
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
458 def set(self, spec, interval_re=re.compile('''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
459 \s*(?P<s>[-+])? # + or -
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
460 \s*((?P<y>\d+\s*)y)? # year
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
461 \s*((?P<m>\d+\s*)m)? # month
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
462 \s*((?P<w>\d+\s*)w)? # week
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
463 \s*((?P<d>\d+\s*)d)? # day
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464 \s*(((?P<H>\d+):(?P<M>\d+))?(:(?P<S>\d+))?)? # time
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
465 \s*''', re.VERBOSE), serialised_re=re.compile('''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466 (?P<s>[+-])?1?(?P<y>([ ]{3}\d|\d{4}))(?P<m>\d{2})(?P<d>\d{2})
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467 (?P<H>\d{2})(?P<M>\d{2})(?P<S>\d{2})''', re.VERBOSE)):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 ''' set the date to the value in spec
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
470 self.year = self.month = self.week = self.day = self.hour = \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
471 self.minute = self.second = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472 self.sign = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
473 m = serialised_re.match(spec)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474 if not m:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
475 m = interval_re.match(spec)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
476 if not m:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
477 raise ValueError, _('Not an interval spec: [+-] [#y] [#m] [#w] '
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
478 '[#d] [[[H]H:MM]:SS]')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
479
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
480 info = m.groupdict()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
481 for group, attr in {'y':'year', 'm':'month', 'w':'week', 'd':'day',
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
482 'H':'hour', 'M':'minute', 'S':'second'}.items():
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
483 if info.get(group, None) is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
484 setattr(self, attr, int(info[group]))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
485
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
486 if self.week:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
487 self.day = self.day + self.week*7
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 if info['s'] is not None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
490 self.sign = {'+':1, '-':-1}[info['s']]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
491
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
492 def __repr__(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
493 return '<Interval %s>'%self.__str__()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
494
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
495 def pretty(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 ''' print up the date date using one of these nice formats..
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
497 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498 if self.year:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
499 if self.year == 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
500 return _('1 year')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
501 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
502 return _('%(number)s years')%{'number': self.year}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
503 elif self.month or self.day > 13:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
504 days = (self.month * 30) + self.day
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
505 if days > 28:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
506 if int(days/30) > 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
507 s = _('%(number)s months')%{'number': int(days/30)}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
508 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
509 s = _('1 month')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
510 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
511 s = _('%(number)s weeks')%{'number': int(days/7)}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
512 elif self.day > 7:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
513 s = _('1 week')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
514 elif self.day > 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
515 s = _('%(number)s days')%{'number': self.day}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
516 elif self.day == 1 or self.hour > 12:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
517 if self.sign > 0:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
518 return _('tomorrow')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
519 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
520 return _('yesterday')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
521 elif self.hour > 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
522 s = _('%(number)s hours')%{'number': self.hour}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
523 elif self.hour == 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
524 if self.minute < 15:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
525 s = _('an hour')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
526 elif self.minute/15 == 2:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
527 s = _('1 1/2 hours')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
528 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
529 s = _('1 %(number)s/4 hours')%{'number': self.minute/15}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
530 elif self.minute < 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
531 if self.sign > 0:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
532 return _('in a moment')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
533 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
534 return _('just now')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
535 elif self.minute == 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
536 s = _('1 minute')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
537 elif self.minute < 15:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
538 s = _('%(number)s minutes')%{'number': self.minute}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
539 elif int(self.minute/15) == 2:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
540 s = _('1/2 an hour')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
541 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
542 s = _('%(number)s/4 hour')%{'number': int(self.minute/15)}
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
543 if self.sign < 0:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
544 s = s + _(' ago')
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
545 else:
1601
df49c7d31073 [SF#724626]
Richard Jones <richard@users.sourceforge.net>
parents: 1489
diff changeset
546 s = _('in ') + s
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
547 return s
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
548
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
549 def get_tuple(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
550 return (self.sign, self.year, self.month, self.day, self.hour,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
551 self.minute, self.second)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
552
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
553 def serialise(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
554 sign = self.sign > 0 and '+' or '-'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
555 return '%s%04d%02d%02d%02d%02d%02d'%(sign, self.year, self.month,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
556 self.day, self.hour, self.minute, self.second)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
557
1489
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
558 def fixTimeOverflow(time):
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
559 ''' Handle the overflow in the time portion (H, M, S) of "time":
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
560 (sign, y,m,d,H,M,S)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
561
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
562 Overflow and underflow will at most affect the _days_ portion of
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
563 the date. We do not overflow days to months as we don't know _how_
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
564 to, generally.
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
565 '''
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
566 # XXX we could conceivably use this function for handling regular dates
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
567 # XXX too - we just need to interrogate the month/year for the day
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
568 # XXX overflow...
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
569
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
570 sign, y, m, d, H, M, S = time
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
571 seconds = sign * (S + M*60 + H*60*60 + d*60*60*24)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
572 if seconds:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
573 sign = seconds<0 and -1 or 1
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
574 seconds *= sign
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
575 S = seconds%60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
576 seconds /= 60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
577 M = seconds%60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
578 seconds /= 60
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
579 H = seconds%24
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
580 d = seconds / 24
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
581 else:
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
582 months = y*12 + m
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
583 sign = months<0 and -1 or 1
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
584 months *= sign
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
585 m = months%12
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
586 y = months/12
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
587
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
588 return (sign, y, m, d, H, M, S)
f0da50a17e3c backport Interval fix from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
589
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 def test():
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 for interval in intervals:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 print '>>> Interval("%s")'%interval
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595 print `Interval(interval)`
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
596
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
597 dates = (".", "2000-06-25.19:34:02", ". + 2d", "1997-04-17", "01-25",
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
598 "08-13.22:13", "14:25")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
599 for date in dates:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 print '>>> Date("%s")'%date
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601 print `Date(date)`
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
602
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
603 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
604 for date, interval in sums:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
605 print '>>> Date("%s") + Interval("%s")'%(date, interval)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 print `Date(date) + Interval(interval)`
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
608 if __name__ == '__main__':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
609 test()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
610
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
611 # vim: set filetype=python ts=4 sw=4 et si

Roundup Issue Tracker: http://roundup-tracker.org/