annotate roundup/date.py @ 5305:e20f472fde7d

issue2550799: provide basic support for handling html only emails Initial implementation and testing with the dehtml html converter done. The use of beautifulsoup 4 is not tested. My test system breaks when running dehtml.py using beautiful soup. I don't get the failures when running under the test harness, but the text output is significantly different (different line breaks, number of newlines etc.) The tests for dehtml need to be generated for beautiful soup and the expected output changed. Since I have a wonky install of beautiful soup, I don't trust my output as the standard to test against. Also since beautiful soup is optional, the test harness needs to skip the beautifulsoup tests if import bs4 fails. Again something outside of my expertise. I deleted the work I had done to implement that. I could not get it working and wanted to get this feature in in some form.
author John Rouillard <rouilj@ieee.org>
date Fri, 13 Oct 2017 21:46:59 -0400
parents 03505579abef
children 64b05e24dbd8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
4 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
5 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
17
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
18 """Date, time and time interval handling.
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
19 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
20 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
22 import calendar
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
23 import datetime
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
24 import time
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
25 import re
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
27 try:
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
28 import pytz
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
29 except ImportError:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
30 pytz = None
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
31
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
32 from roundup import i18n
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
33
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
34 # no, I don't know why we must anchor the date RE when we only ever use it
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
35 # in a match()
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
36 date_re = re.compile(r'''^
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
37 ((?P<y>\d\d\d\d)([/-](?P<m>\d\d?)([/-](?P<d>\d\d?))?)? # yyyy[-mm[-dd]]
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
38 |(?P<a>\d\d?)[/-](?P<b>\d\d?))? # or mm-dd
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
39 (?P<n>\.)? # .
3611
86d568dbab55 allow single digit seconds in date spec [SF#1447141]
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
40 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d?(\.\d+)?))?)? # hh:mm:ss
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
41 (?:(?P<tz>\s?[+-]\d{4})|(?P<o>[\d\smywd\-+]+))? # time-zone offset, offset
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
42 $''', re.VERBOSE)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
43 serialised_date_re = re.compile(r'''
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
44 (\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d?(\.\d+)?)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
45 ''', re.VERBOSE)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
46
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
47 _timedelta0 = datetime.timedelta(0)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
48
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
49 # load UTC tzinfo
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
50 if pytz:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
51 UTC = pytz.utc
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
52 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
53 # fallback implementation from Python Library Reference
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
54
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
55 class _UTC(datetime.tzinfo):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
56
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
57 """Universal Coordinated Time zoneinfo"""
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
58
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
59 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
60 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
61
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
62 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
63 return "UTC"
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
64
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
65 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
66 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
67
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
68 def __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
69 return "<UTC>"
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
70
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
71 # pytz adjustments interface
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
72 # Note: pytz verifies that dt is naive datetime for localize()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
73 # and not naive datetime for normalize().
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
74 # In this implementation, we don't care.
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
75
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
76 def normalize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
77 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
78
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
79 def localize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
80 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
81
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
82 UTC = _UTC()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
83
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
84 # integral hours offsets were available in Roundup versions prior to 1.1.3
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
85 # and still are supported as a fallback if pytz module is not installed
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
86 class SimpleTimezone(datetime.tzinfo):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
87
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
88 """Simple zoneinfo with fixed numeric offset and no daylight savings"""
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
89
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
90 def __init__(self, offset=0, name=None):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
91 super(SimpleTimezone, self).__init__()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
92 self.offset = offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
93 if name:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
94 self.name = name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
95 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
96 self.name = "Etc/GMT%+d" % self.offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
97
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
98 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
99 return datetime.timedelta(hours=self.offset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
100
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
101 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
102 return self.name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
103
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
104 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
105 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
106
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
107 def __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
108 return "<%s: %s>" % (self.__class__.__name__, self.name)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
109
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
110 # pytz adjustments interface
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
111
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
112 def normalize(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
113 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
114
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
115 def localize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
116 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
117
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
118 # simple timezones with fixed offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
119 _tzoffsets = dict(GMT=0, UCT=0, EST=5, MST=7, HST=10)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
120
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
121 def get_timezone(tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
122 # if tz is None, return None (will result in naive datetimes)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
123 # XXX should we return UTC for None?
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
124 if tz is None:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
125 return None
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
126 # try integer offset first for backward compatibility
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
127 try:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
128 utcoffset = int(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
129 except (TypeError, ValueError):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
130 pass
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
131 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
132 if utcoffset == 0:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
133 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
134 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
135 return SimpleTimezone(utcoffset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
136 # tz is a timezone name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
137 if pytz:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
138 return pytz.timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
139 elif tz == "UTC":
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
140 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
141 elif tz in _tzoffsets:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
142 return SimpleTimezone(_tzoffsets[tz], tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
143 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
144 raise KeyError, tz
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
145
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
146 def _utc_to_local(y,m,d,H,M,S,tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
147 TZ = get_timezone(tz)
4856
392a055fdc21 issue2117897: Fixed two more rounding to 60.0 seconds in date.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4773
diff changeset
148 S = min(S, 59.999)
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
149 frac = S - int(S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
150 dt = datetime.datetime(y, m, d, H, M, int(S), tzinfo=UTC)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
151 y,m,d,H,M,S = dt.astimezone(TZ).timetuple()[:6]
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
152 S = S + frac
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
153 return (y,m,d,H,M,S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
154
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
155 def _local_to_utc(y,m,d,H,M,S,tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
156 TZ = get_timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
157 dt = datetime.datetime(y,m,d,H,M,int(S))
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
158 y,m,d,H,M,S = TZ.localize(dt).utctimetuple()[:6]
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
159 return (y,m,d,H,M,S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
160
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
161 def test_ini(t):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
162 """ Monkey-patch to make doctest think it's always time t:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
163 """
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
164 u = Date.now
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
165 d = datetime.datetime.strptime (t, '%Y-%m-%d.%H:%M:%S.%f')
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
166 Date.now = lambda x : d
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
167 return u
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
168
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
169 def test_fin(u):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
170 """ Undo monkey patch above
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
171 """
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
172 Date.now = u
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
173
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 class Date:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 As strings, date-and-time stamps are specified with the date in
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 international standard format (yyyy-mm-dd) joined to the time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 (hh:mm:ss) by a period ("."). Dates in this form can be easily compared
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 and are fairly readable when printed. An example of a valid stamp is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 "2000-06-24.13:03:59". We'll call this the "full date format". When
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 Timestamp objects are printed as strings, they appear in the full date
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
182 format with the time always given in UTC. The full date format is
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
183 always exactly 19 characters long.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 For user input, some partial forms are also permitted: the whole time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 or just the seconds may be omitted; and the whole date may be omitted
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 or just the year may be omitted. If the time is given, the time is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 interpreted in the user's local time zone. The Date constructor takes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 care of these conversions. In the following examples, suppose that yyyy
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 is the current year, mm is the current month, and dd is the current day
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 of the month; and suppose that the user is on Eastern Standard Time.
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
192
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
193 Note that Date conversion from user inputs will use the local
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
194 timezone, either from the database user (some database schemas have
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
195 a timezone property for a user) or from a default in the roundup
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
196 configuration. Roundup will store all times in UTC in the database
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
197 but display the time to the user in their local timezone as
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
198 configured. In the following examples the timezone correction for
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
199 Eastern Standard Time (GMT-5, no DST) will be applied explicitly via
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
200 an offset, but times are given in UTC in the output.
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
201
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
202 Examples::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
204
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
205 make doctest think it's always 2000-06-26.00:34:02:
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
206 >>> u = test_ini('2000-06-26.00:34:02.0')
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
207
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
208 >>> Date("2000-04-17-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
209 <Date 2000-04-17.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
210 >>> Date("01-25-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
211 <Date 2000-01-25.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
212 >>> Date("2000-04-17.03:45-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
213 <Date 2000-04-17.08:45:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
214 >>> Date("08-13.22:13-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
215 <Date 2000-08-14.03:13:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
216 >>> Date("11-07.09:32:43-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
217 <Date 2000-11-07.14:32:43.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
218 >>> Date("14:25-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
219 <Date 2000-06-26.19:25:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
220 >>> Date("8:47:11-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
221 <Date 2000-06-26.13:47:11.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
222 >>> Date("2003 -0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
223 <Date 2003-01-01.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
224 >>> Date("2003-06 -0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
225 <Date 2003-06-01.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
226
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
227 "." means "right now":
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
228 >>> Date(".")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
229 <Date 2000-06-26.00:34:02.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
230
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
231 >>> test_fin(u)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 The Date class should understand simple date expressions of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 stamp + interval and stamp - interval. When adding or subtracting
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 intervals involving months or years, the components are handled
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 first add one month to get 2000-07-25, then add 10 days to get
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
239 or 41 days). Example usage::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
241 make doctest think it's always 2000-06-26.00:34:02:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
242 >>> u = test_ini('2000-06-26.00:34:02.0')
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
243
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 >>> Date(".")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
245 <Date 2000-06-26.00:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 >>> _.local(-5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
247 <Date 2000-06-25.19:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 >>> Date(". + 2d")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
249 <Date 2000-06-28.00:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 >>> Date("1997-04-17", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
251 <Date 1997-04-17.05:00:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 >>> Date("01-25", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
253 <Date 2000-01-25.05:00:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 >>> Date("08-13.22:13", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
255 <Date 2000-08-14.03:13:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 >>> Date("14:25", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
257 <Date 2000-06-26.19:25:00.000>
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
258
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
259 The date format 'yyyymmddHHMMSS' (year, month, day, hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
260 minute, second) is the serialisation format returned by the serialise()
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
261 method, and is accepted as an argument on instatiation.
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
262
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
263 In addition, a timezone specifier can be appended to the date format.
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
264 The timezone specifier is a sign ("+" or "-") followed by a 4-digit
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
265 number as in the RFC 2822 date format.
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
266 The first two digits indicate the number of hours, while the last two
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
267 digits indicate the number of minutes the time is offset from
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
268 Coordinated Universal Time (UTC). The "+" or "-" sign indicate whether
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
269 the time is ahead of (east of) or behind (west of) UTC. Note that a
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
270 given timezone specifier *overrides* an offset given to the Date
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
271 constructor. Examples::
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
272
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
273 >>> Date ("2000-08-14+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
274 <Date 2000-08-13.22:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
275 >>> Date ("08-15.22:00+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
276 <Date 2000-08-15.20:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
277 >>> Date ("08-15.22:47+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
278 <Date 2000-08-15.20:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
279 >>> Date ("08-15.22:47+0200", offset = 5)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
280 <Date 2000-08-15.20:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
281 >>> Date ("08-15.22:47", offset = 5)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
282 <Date 2000-08-15.17:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
283
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
284 The date class handles basic arithmetic, but note that arithmetic
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
285 cannot be combined with timezone offsets (see last example)::
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
286
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
287 >>> x=test_ini('2004-04-06.22:04:20.766830')
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
288 >>> d1=Date('.')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
289 >>> d1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
290 <Date 2004-04-06.22:04:20.767>
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
291 >>> d2=Date('2003-07-01')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
292 >>> d2
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
293 <Date 2003-07-01.00:00:00.000>
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
294 >>> d1-d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
295 <Interval + 280d 22:04:20>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
296 >>> i1=_
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
297 >>> d2+i1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
298 <Date 2004-04-06.22:04:20.000>
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
299 >>> d1-i1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
300 <Date 2003-07-01.00:00:00.000>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
301
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
302 >>> test_fin(u)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 '''
2262
a13ec40cf8f5 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2250
diff changeset
304
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
305 def __init__(self, spec='.', offset=0, add_granularity=False,
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
306 translator=i18n):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
307 """Construct a date given a specification and a time zone offset.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
309 'spec'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
310 is a full date or a partial form, with an optional added or
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
311 subtracted interval. Or a date 9-tuple.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
312 'offset'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
313 is the local time zone offset from GMT in hours.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
314 'translator'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
315 is i18n module or one of gettext translation classes.
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
316 It must have attributes 'gettext' and 'ngettext',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
317 serving as translation functions.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
319 self.setTranslator(translator)
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
320 # Python 2.3+ datetime object
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
321 # common case when reading from database: avoid double-conversion
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
322 if isinstance(spec, datetime.datetime):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
323 if offset == 0:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
324 self.year, self.month, self.day, self.hour, self.minute, \
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
325 self.second = spec.timetuple()[:6]
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
326 else:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
327 TZ = get_timezone(tz)
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
328 self.year, self.month, self.day, self.hour, self.minute, \
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
329 self.second = TZ.localize(spec).utctimetuple()[:6]
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
330 self.second += spec.microsecond/1000000.
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
331 return
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
332
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
333 if type(spec) == type(''):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
334 self.set(spec, offset=offset, add_granularity=add_granularity)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
335 return
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
336 elif hasattr(spec, 'tuple'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
337 spec = spec.tuple()
2539
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
338 elif isinstance(spec, Date):
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
339 spec = spec.get_tuple()
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
340 try:
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
341 y,m,d,H,M,S,x,x,x = spec
4856
392a055fdc21 issue2117897: Fixed two more rounding to 60.0 seconds in date.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4773
diff changeset
342 S = min(S, 59.999)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
343 frac = S - int(S)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 self.year, self.month, self.day, self.hour, self.minute, \
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
345 self.second = _local_to_utc(y, m, d, H, M, S, offset)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
346 # we lost the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
347 self.second = self.second + frac
4773
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
348 # making sure we match the precision of serialise()
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
349 self.second = min(self.second, 59.999)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
350 except:
3210
ea29d69f7415 fix error message formatting in Date.__init__;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3151
diff changeset
351 raise ValueError, 'Unknown spec %r' % (spec,)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
353 def now(self):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
354 """ To be able to override for testing
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
355 """
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
356 return datetime.datetime.utcnow()
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
357
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
358 def set(self, spec, offset=0, date_re=date_re,
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
359 serialised_re=serialised_date_re, add_granularity=False):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
360 ''' set the date to the value in spec
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
361 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
362
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
363 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
364 if m is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
365 # we're serialised - easy!
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
366 g = m.groups()
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
367 (self.year, self.month, self.day, self.hour, self.minute) = \
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
368 map(int, g[:5])
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
369 self.second = float(g[5])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
370 return
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
371
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
372 # not serialised data, try usual format
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
373 m = date_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
374 if m is None:
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
375 raise ValueError, self._('Not a date spec: %r '
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
376 '("yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
377 '"yyyy-mm-dd.HH:MM:SS.SSS")' % spec)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
378
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
379 info = m.groupdict()
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
380
4072
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
381 # If add_granularity is true, construct the maximum time given
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
382 # the precision of the input. For example, given the input
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
383 # "12:15", construct "12:15:59". Or, for "2008", construct
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
384 # "2008-12-31.23:59:59".
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
385 if add_granularity:
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
386 for gran in 'SMHdmy':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
387 if info[gran] is not None:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
388 if gran == 'S':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
389 raise ValueError
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
390 elif gran == 'M':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
391 add_granularity = Interval('00:01')
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
392 elif gran == 'H':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
393 add_granularity = Interval('01:00')
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
394 else:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
395 add_granularity = Interval('+1%s'%gran)
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
396 break
4072
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
397 else:
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
398 raise ValueError(self._('Could not determine granularity'))
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
399
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
400 # get the current date as our default
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
401 dt = self.now()
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
402 y,m,d,H,M,S,x,x,x = dt.timetuple()
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
403 S += dt.microsecond/1000000.
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
404
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
405 # whether we need to convert to UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
406 adjust = False
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
407
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
408 if info['y'] is not None or info['a'] is not None:
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
409 if info['y'] is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
410 y = int(info['y'])
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
411 m,d = (1,1)
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
412 if info['m'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
413 m = int(info['m'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
414 if info['d'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
415 d = int(info['d'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
416 if info['a'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
417 m = int(info['a'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
418 d = int(info['b'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
419 H = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
420 M = S = 0
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
421 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
422
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
423 # override hour, minute, second parts
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
424 if info['H'] is not None and info['M'] is not None:
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
425 H = int(info['H'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
426 M = int(info['M'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
427 S = 0
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
428 if info['S'] is not None:
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
429 S = float(info['S'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
430 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
431
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
432 if info.get('tz', None):
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
433 offset = 0
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
434
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
435 # now handle the adjustment of hour
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
436 frac = S - int(S)
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
437 dt = datetime.datetime(y,m,d,H,M,int(S), int(frac * 1000000.))
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
438 y, m, d, H, M, S, x, x, x = dt.timetuple()
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
439 if adjust:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
440 y, m, d, H, M, S = _local_to_utc(y, m, d, H, M, S, offset)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
441 self.year, self.month, self.day, self.hour, self.minute, \
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
442 self.second = y, m, d, H, M, S
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
443 # we lost the fractional part along the way
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
444 self.second += dt.microsecond/1000000.
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
445
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
446 if info.get('o', None):
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
447 try:
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
448 self.applyInterval(Interval(info['o'], allowdate=0))
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
449 except ValueError:
3151
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
450 raise ValueError, self._('%r not a date / time spec '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
451 '"yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
452 '"yyyy-mm-dd.HH:MM:SS.SSS"')%(spec,)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
453
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
454 if info.get('tz', None):
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
455 tz = info ['tz'].strip ()
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
456 sign = [-1,1][tz[0] == '-']
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
457 minute = int (tz[3:], 10)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
458 hour = int (tz[1:3], 10)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
459 self.applyInterval(Interval((0, 0, 0, hour, minute, 0), sign=sign))
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
460
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
461 # adjust by added granularity
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
462 if add_granularity:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
463 self.applyInterval(add_granularity)
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
464 self.applyInterval(Interval('- 00:00:01'))
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
465
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
466 def addInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
467 ''' Add the interval to this date, returning the date tuple
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 '''
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
469 # do the basic calc
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
470 sign = interval.sign
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
471 year = self.year + sign * interval.year
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
472 month = self.month + sign * interval.month
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
473 day = self.day + sign * interval.day
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
474 hour = self.hour + sign * interval.hour
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
475 minute = self.minute + sign * interval.minute
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
476 # Intervals work on whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
477 second = int(self.second) + sign * interval.second
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
478
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
479 # now cope with under- and over-flow
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
480 # first do the time
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
481 while (second < 0 or second > 59 or minute < 0 or minute > 59 or
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
482 hour < 0 or hour > 23):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
483 if second < 0: minute -= 1; second += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
484 elif second > 59: minute += 1; second -= 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
485 if minute < 0: hour -= 1; minute += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
486 elif minute > 59: hour += 1; minute -= 60
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
487 if hour < 0: day -= 1; hour += 24
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
488 elif hour > 23: day += 1; hour -= 24
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
489
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
490 # fix up the month so we're within range
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
491 while month < 1 or month > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
492 if month < 1: year -= 1; month += 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
493 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
494
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
495 # now do the days, now that we know what month we're in
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
496 def get_mdays(year, month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
497 if month == 2 and calendar.isleap(year): return 29
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
498 else: return calendar.mdays[month]
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
499
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
500 while month < 1 or month > 12 or day < 1 or day > get_mdays(year,month):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
501 # now to day under/over
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
502 if day < 1:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
503 # When going backwards, decrement month, then increment days
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
504 month -= 1
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
505 day += get_mdays(year,month)
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
506 elif day > get_mdays(year,month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
507 # When going forwards, decrement days, then increment month
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
508 day -= get_mdays(year,month)
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
509 month += 1
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
510
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
511 # possibly fix up the month so we're within range
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
512 while month < 1 or month > 12:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
513 if month < 1: year -= 1; month += 12 ; day += 31
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
514 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
515
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
516 return (year, month, day, hour, minute, second, 0, 0, 0)
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
517
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
518 def differenceDate(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
519 "Return the difference between this date and another date"
2189
d39068bc6ef9 implement differenceDate ;)
Richard Jones <richard@users.sourceforge.net>
parents: 2188
diff changeset
520 return self - other
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
521
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
522 def applyInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
523 ''' Apply the interval to this date
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
524 '''
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
525 self.year, self.month, self.day, self.hour, self.minute, \
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
526 self.second, x, x, x = self.addInterval(interval)
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
527
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
528 def __add__(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
529 """Add an interval to this date to produce another date.
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
530 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
531 return Date(self.addInterval(interval), translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
532
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1094
diff changeset
533 # deviates from spec to allow subtraction of dates as well
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
534 def __sub__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
535 """ Subtract:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
536 1. an interval from this date to produce another date.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
537 2. a date from this date to produce an interval.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
538 """
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
539 if isinstance(other, Interval):
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
540 other = Interval(other.get_tuple())
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
541 other.sign *= -1
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
542 return self.__add__(other)
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
543
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
544 assert isinstance(other, Date), 'May only subtract Dates or Intervals'
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
545
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
546 return self.dateDelta(other)
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
547
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
548 def dateDelta(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
549 """ Produce an Interval of the difference between this date
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
550 and another date. Only returns days:hours:minutes:seconds.
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
551 """
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
552 # Returning intervals larger than a day is almost
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
553 # impossible - months, years, weeks, are all so imprecise.
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
554 a = calendar.timegm((self.year, self.month, self.day, self.hour,
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
555 self.minute, self.second, 0, 0, 0))
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
556 b = calendar.timegm((other.year, other.month, other.day,
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
557 other.hour, other.minute, other.second, 0, 0, 0))
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
558 # intervals work in whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
559 diff = int(a - b)
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
560 if diff > 0:
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
561 sign = 1
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
562 else:
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
563 sign = -1
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
564 diff = -diff
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
565 S = diff%60
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
566 M = (diff/60)%60
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
567 H = (diff/(60*60))%24
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
568 d = diff/(24*60*60)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
569 return Interval((0, 0, d, H, M, S), sign=sign,
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
570 translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
572 def __cmp__(self, other, int_seconds=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 """Compare this date to another date."""
543
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
574 if other is None:
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
575 return 1
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
576 for attr in ('year', 'month', 'day', 'hour', 'minute'):
890
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
577 if not hasattr(other, attr):
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
578 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 r = cmp(getattr(self, attr), getattr(other, attr))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
580 if r: return r
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
581 if not hasattr(other, 'second'):
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
582 return 1
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
583 if int_seconds:
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
584 return cmp(int(self.second), int(other.second))
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
585 return cmp(self.second, other.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
587 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format."""
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
589 return self.formal()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
590
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
591 def formal(self, sep='.', sec='%02d'):
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
592 f = '%%04d-%%02d-%%02d%s%%02d:%%02d:%s'%(sep, sec)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
593 return f%(self.year, self.month, self.day, self.hour, self.minute,
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
594 self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
596 def pretty(self, format='%d %B %Y'):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
597 ''' print up the date date using a pretty format...
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
598
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
599 Note that if the day is zero, and the day appears first in the
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
600 format, then the day number will be removed from output.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601 '''
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
602 dt = datetime.datetime(self.year, self.month, self.day, self.hour,
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
603 self.minute, int(self.second),
3823
7cda5b4daa91 fix a deprecation warning if usecs passed to datetime constructor is a float.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3822
diff changeset
604 int ((self.second - int (self.second)) * 1000000.))
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
605 str = dt.strftime(format)
3028
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
606
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
607 # handle zero day by removing it
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
608 if format.startswith('%d') and str[0] == '0':
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
609 return ' ' + str[1:]
585
c08fb4921eda %e is a UNIXism and not documented for Python
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 543
diff changeset
610 return str
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
611
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
612 def __repr__(self):
3612
afda59d5d546 prevent generation of new single-digit seconds dates [SF#1429390]
Richard Jones <richard@users.sourceforge.net>
parents: 3611
diff changeset
613 return '<Date %s>'%self.formal(sec='%06.3f')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
614
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
615 def local(self, offset):
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
616 """ Return this date as yyyy-mm-dd.hh:mm:ss in a local time zone.
4422
ad7176d22f43 - add comment to clarify semantics if pytz is installed
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4072
diff changeset
617 The offset is a pytz tz offset if pytz is installed.
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
618 """
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
619 y, m, d, H, M, S = _utc_to_local(self.year, self.month, self.day,
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
620 self.hour, self.minute, self.second, offset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
621 return Date((y, m, d, H, M, S, 0, 0, 0), translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
622
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
623 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
624 return Date((self.year, self.month, self.day, self.hour,
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
625 self.minute, self.second, 0, 0, 0), translator=self.translator)
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
626
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
627 def get_tuple(self):
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
628 return (self.year, self.month, self.day, self.hour, self.minute,
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
629 self.second, 0, 0, 0)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
630
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
631 def serialise(self):
4773
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
632 """ Return serialised string for self's datetime.
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
633
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
634 Uses '%06.3f' as format for self.second, which therefor
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
635 must be <=59.999 to work. Otherwise it will be rounded
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
636 to 60.000.
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
637
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
638 """
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
639 return '%04d%02d%02d%02d%02d%06.3f'%(self.year, self.month,
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
640 self.day, self.hour, self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
641
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
642 def timestamp(self):
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
643 ''' return a UNIX timestamp for this date '''
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
644 frac = self.second - int(self.second)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
645 ts = calendar.timegm((self.year, self.month, self.day, self.hour,
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
646 self.minute, self.second, 0, 0, 0))
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
647 # we lose the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
648 return ts + frac
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
649
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
650 def setTranslator(self, translator):
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
651 """Replace the translation engine
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
652
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
653 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
654 is i18n module or one of gettext translation classes.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
655 It must have attributes 'gettext' and 'ngettext',
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
656 serving as translation functions.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
657 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
658 self.translator = translator
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
659 self._ = translator.gettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
660 self.ngettext = translator.ngettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
661
3825
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
662 def fromtimestamp(cls, ts):
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
663 """Create a date object from a timestamp.
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
664
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
665 The timestamp may be outside the gmtime year-range of
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
666 1902-2038.
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
667 """
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
668 usec = int((ts - int(ts)) * 1000000.)
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
669 delta = datetime.timedelta(seconds = int(ts), microseconds = usec)
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
670 return cls(datetime.datetime(1970, 1, 1) + delta)
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
671 fromtimestamp = classmethod(fromtimestamp)
f5bb1ad47268 Add a class-method as a constructor of a Date object from a timestamp.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3823
diff changeset
672
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
673 class Interval:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
675 Date intervals are specified using the suffixes "y", "m", and "d". The
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676 suffix "w" (for "week") means 7 days. Time intervals are specified in
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
677 hh:mm:ss format (the seconds may be omitted, but the hours and minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
678 may not).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
679
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
680 "3y" means three years
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
681 "2y 1m" means two years and one month
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
682 "1m 25d" means one month and 25 days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
683 "2w 3d" means two weeks and three days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
684 "1d 2:50" means one day, two hours, and 50 minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
685 "14:00" means 14 hours
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
686 "0:04:33" means four minutes and 33 seconds
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
687
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
688 Example usage:
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
689 make doctest think it's always 2000-06-26.00:34:02:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
690 >>> u = test_ini('2000-06-26.00:34:02.0')
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
691
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
692 >>> Interval(" 3w 1 d 2:00")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
693 <Interval + 22d 2:00>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
694 >>> Date(". + 2d") + Interval("- 3w")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
695 <Date 2000-06-07.00:34:02.000>
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
696 >>> Interval('1:59:59') + Interval('00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
697 <Interval + 2:00>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
698 >>> Interval('2:00') + Interval('- 00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
699 <Interval + 1:59:59>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
700 >>> Interval('1y')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
701 <Interval + 6m>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
702 >>> Interval('1:00')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
703 <Interval + 0:30>
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
704
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
705 [number of days between 2000-06-26.00:34:02 and 2003-03-18
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
706 >>> Interval('2003-03-18')
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
707 <Interval - 995d>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
708
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
709 [number of days between 2000-06-26.00:34:02 and 2003-03-14
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
710 >>> Interval('-4d 2003-03-18')
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
711 <Interval - 991d>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
712
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
713 >>> test_fin(u)
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
714
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
715 Interval arithmetic is handled in a couple of special ways, trying
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
716 to cater for the most common cases. Fundamentally, Intervals which
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
717 have both date and time parts will result in strange results in
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
718 arithmetic - because of the impossibility of handling day->month->year
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
719 over- and under-flows. Intervals may also be divided by some number.
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
720
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
721 Intervals are added to Dates in order of:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
722 seconds, minutes, hours, years, months, days
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
723
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
724 Calculations involving months (eg '+2m') have no effect on days - only
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
725 days (or over/underflow from hours/mins/secs) will do that, and
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
726 days-per-month and leap years are accounted for. Leap seconds are not.
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
727
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
728 The interval format 'syyyymmddHHMMSS' (sign, year, month, day, hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
729 minute, second) is the serialisation format returned by the serialise()
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
730 method, and is accepted as an argument on instatiation.
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
731
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
732 TODO: more examples, showing the order of addition operation
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 '''
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
734 def __init__(self, spec, sign=1, allowdate=1, add_granularity=False,
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
735 translator=i18n
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
736 ):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737 """Construct an interval given a specification."""
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
738 self.setTranslator(translator)
3349
9c65e32514aa types module delenda est
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 3231
diff changeset
739 if isinstance(spec, (int, float, long)):
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
740 self.from_seconds(spec)
3349
9c65e32514aa types module delenda est
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 3231
diff changeset
741 elif isinstance(spec, basestring):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
742 self.set(spec, allowdate=allowdate, add_granularity=add_granularity)
2729
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
743 elif isinstance(spec, Interval):
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
744 (self.sign, self.year, self.month, self.day, self.hour,
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
745 self.minute, self.second) = spec.get_tuple()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
746 else:
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
747 if len(spec) == 7:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
748 self.sign, self.year, self.month, self.day, self.hour, \
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
749 self.minute, self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
750 self.second = int(self.second)
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
751 else:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
752 # old, buggy spec form
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
753 self.sign = sign
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
754 self.year, self.month, self.day, self.hour, self.minute, \
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
755 self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
756 self.second = int(self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
757
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
758 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
759 return Interval((self.sign, self.year, self.month, self.day,
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
760 self.hour, self.minute, self.second), translator=self.translator)
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
761
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
762 def set(self, spec, allowdate=1, interval_re=re.compile('''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
763 \s*(?P<s>[-+])? # + or -
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
764 \s*((?P<y>\d+\s*)y)? # year
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
765 \s*((?P<m>\d+\s*)m)? # month
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
766 \s*((?P<w>\d+\s*)w)? # week
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
767 \s*((?P<d>\d+\s*)d)? # day
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
768 \s*(((?P<H>\d+):(?P<M>\d+))?(:(?P<S>\d+))?)? # time
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
769 \s*(?P<D>
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
770 (\d\d\d\d[/-])?(\d\d?)?[/-](\d\d?)? # [yyyy-]mm-dd
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
771 \.? # .
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
772 (\d?\d:\d\d)?(:\d\d)? # hh:mm:ss
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
773 )?''', re.VERBOSE), serialised_re=re.compile('''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
774 (?P<s>[+-])?1?(?P<y>([ ]{3}\d|\d{4}))(?P<m>\d{2})(?P<d>\d{2})
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
775 (?P<H>\d{2})(?P<M>\d{2})(?P<S>\d{2})''', re.VERBOSE),
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
776 add_granularity=False):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
777 ''' set the date to the value in spec
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
778 '''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
779 self.year = self.month = self.week = self.day = self.hour = \
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
780 self.minute = self.second = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
781 self.sign = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
782 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
783 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
784 m = interval_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
785 if not m:
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
786 raise ValueError, self._('Not an interval spec: "%s"'
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
787 ' ([+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS] [date spec])'
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
788 % spec)
1542
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
789 else:
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
790 allowdate = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
791
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
792 # pull out all the info specified
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
793 info = m.groupdict()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
794 if add_granularity:
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
795 for gran in 'SMHdwmy':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
796 if info[gran] is not None:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
797 info[gran] = int(info[gran]) + (info['s']=='-' and -1 or 1)
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
798 break
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
799
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
800 valid = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
801 for group, attr in {'y':'year', 'm':'month', 'w':'week', 'd':'day',
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
802 'H':'hour', 'M':'minute', 'S':'second'}.items():
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
803 if info.get(group, None) is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
804 valid = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
805 setattr(self, attr, int(info[group]))
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
806
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
807 # make sure it's valid
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
808 if not valid and not info['D']:
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
809 raise ValueError, self._('Not an interval spec: "%s"'
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
810 ' ([+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS])'
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
811 % spec)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
812
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
813 if self.week:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
814 self.day = self.day + self.week*7
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
815
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
816 if info['s'] is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
817 self.sign = {'+':1, '-':-1}[info['s']]
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
818
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
819 # use a date spec if one is given
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
820 if allowdate and info['D'] is not None:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
821 now = Date('.')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
822 date = Date(info['D'])
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
823 # if no time part was specified, nuke it in the "now" date
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
824 if not date.hour or date.minute or date.second:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
825 now.hour = now.minute = now.second = 0
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
826 if date != now:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
827 y = now - (date + self)
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
828 self.__init__(y.get_tuple())
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
829
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
830 def __cmp__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
831 """Compare this interval to another interval."""
4461
5f82173d1684 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4422
diff changeset
832
4465
605f31a596b8 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4461
diff changeset
833 if other is None:
605f31a596b8 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4461
diff changeset
834 # we are always larger than None
605f31a596b8 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4461
diff changeset
835 return 1
4461
5f82173d1684 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4422
diff changeset
836 return cmp(self.as_seconds(), other.as_seconds())
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
837
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
838 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
839 """Return this interval as a string."""
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
840 l = []
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
841 if self.year: l.append('%sy'%self.year)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
842 if self.month: l.append('%sm'%self.month)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
843 if self.day: l.append('%sd'%self.day)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
844 if self.second:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
845 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
846 elif self.hour or self.minute:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
847 l.append('%d:%02d'%(self.hour, self.minute))
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
848 if l:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
849 l.insert(0, {1:'+', -1:'-'}[self.sign])
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
850 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
851 l.append('00:00')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
852 return ' '.join(l)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
853
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
854 def __add__(self, other):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
855 if isinstance(other, Date):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
856 # the other is a Date - produce a Date
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
857 return Date(other.addInterval(self), translator=self.translator)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
858 elif isinstance(other, Interval):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
859 # add the other Interval to this one
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
860 a = self.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
861 asgn = a[0]
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
862 b = other.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
863 bsgn = b[0]
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
864 i = [asgn*x + bsgn*y for x,y in zip(a[1:],b[1:])]
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
865 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
866 i = fixTimeOverflow(i)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
867 return Interval(i, translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
868 # nope, no idea what to do with this other...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
869 raise TypeError, "Can't add %r"%other
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
870
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
871 def __sub__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
872 if isinstance(other, Date):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
873 # the other is a Date - produce a Date
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
874 interval = Interval(self.get_tuple())
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
875 interval.sign *= -1
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
876 return Date(other.addInterval(interval),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
877 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
878 elif isinstance(other, Interval):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
879 # add the other Interval to this one
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
880 a = self.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
881 asgn = a[0]
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
882 b = other.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
883 bsgn = b[0]
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
884 i = [asgn*x - bsgn*y for x,y in zip(a[1:],b[1:])]
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
885 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
886 i = fixTimeOverflow(i)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
887 return Interval(i, translator=self.translator)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
888 # nope, no idea what to do with this other...
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
889 raise TypeError, "Can't add %r"%other
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
890
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
891 def __div__(self, other):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
892 """ Divide this interval by an int value.
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
893
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
894 Can't divide years and months sensibly in the _same_
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
895 calculation as days/time, so raise an error in that situation.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
896 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
897 try:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
898 other = float(other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
899 except TypeError:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
900 raise ValueError, "Can only divide Intervals by numbers"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
901
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
902 y, m, d, H, M, S = (self.year, self.month, self.day,
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
903 self.hour, self.minute, self.second)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
904 if y or m:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
905 if d or H or M or S:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
906 raise ValueError, "Can't divide Interval with date and time"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
907 months = self.year*12 + self.month
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
908 months *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
909
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
910 months = int(months/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
911
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
912 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
913 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
914 y = months / 12
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
915 return Interval((sign, y, m, 0, 0, 0, 0),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
916 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
917
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
918 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
919 # handle a day/time division
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
920 seconds = S + M*60 + H*60*60 + d*60*60*24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
921 seconds *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
922
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
923 seconds = int(seconds/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
924
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
925 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
926 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
927 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
928 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
929 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
930 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
931 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
932 d = seconds / 24
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
933 return Interval((sign, 0, 0, d, H, M, S),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
934 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
935
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
936 def __repr__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
937 return '<Interval %s>'%self.__str__()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
938
487
2f4c37d28108 I18N'ification
Richard Jones <richard@users.sourceforge.net>
parents: 406
diff changeset
939 def pretty(self):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940 ''' print up the date date using one of these nice formats..
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
941 '''
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
942 _quarters = self.minute / 15
720
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
943 if self.year:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
944 s = self.ngettext("%(number)s year", "%(number)s years",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
945 self.year) % {'number': self.year}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
946 elif self.month or self.day > 28:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
947 _months = max(1, int(((self.month * 30) + self.day) / 30))
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
948 s = self.ngettext("%(number)s month", "%(number)s months",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
949 _months) % {'number': _months}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
950 elif self.day > 7:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
951 _weeks = int(self.day / 7)
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
952 s = self.ngettext("%(number)s week", "%(number)s weeks",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
953 _weeks) % {'number': _weeks}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
954 elif self.day > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
955 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
956 s = self.ngettext('%(number)s day', '%(number)s days',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
957 self.day) % {'number': self.day}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
958 elif self.day == 1 or self.hour > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
959 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
960 return self._('tomorrow')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
961 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
962 return self._('yesterday')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
963 elif self.hour > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
964 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
965 s = self.ngettext('%(number)s hour', '%(number)s hours',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
966 self.hour) % {'number': self.hour}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
967 elif self.hour == 1:
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
968 if self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
969 s = self._('an hour')
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
970 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
971 s = self._('1 1/2 hours')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
972 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
973 s = self.ngettext('1 %(number)s/4 hours',
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
974 '1 %(number)s/4 hours', _quarters)%{'number': _quarters}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
975 elif self.minute < 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
976 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
977 return self._('in a moment')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
978 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
979 return self._('just now')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
980 elif self.minute == 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
981 # Note: used in expressions "in 1 minute" or "1 minute ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
982 s = self._('1 minute')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
983 elif self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
984 # Note: used in expressions "in 2 minutes" or "2 minutes ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
985 s = self.ngettext('%(number)s minute', '%(number)s minutes',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
986 self.minute) % {'number': self.minute}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
987 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
988 s = self._('1/2 an hour')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
989 else:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
990 s = self.ngettext('%(number)s/4 hour', '%(number)s/4 hours',
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
991 _quarters) % {'number': _quarters}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
992 # XXX this is internationally broken
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
993 if self.sign < 0:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
994 s = self._('%s ago') % s
1413
4ae9d725bec4 make future intervals obvious too
Richard Jones <richard@users.sourceforge.net>
parents: 1412
diff changeset
995 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
996 s = self._('in %s') % s
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
997 return s
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
998
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
999 def get_tuple(self):
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1000 return (self.sign, self.year, self.month, self.day, self.hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1001 self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1002
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1003 def serialise(self):
1261
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
1004 sign = self.sign > 0 and '+' or '-'
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
1005 return '%s%04d%02d%02d%02d%02d%02d'%(sign, self.year, self.month,
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1006 self.day, self.hour, self.minute, self.second)
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
1007
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1008 def as_seconds(self):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1009 '''Calculate the Interval as a number of seconds.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1010
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1011 Months are counted as 30 days, years as 365 days. Returns a Long
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1012 int.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1013 '''
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1014 n = self.year * 365L
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1015 n = n + self.month * 30
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1016 n = n + self.day
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1017 n = n * 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1018 n = n + self.hour
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1019 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1020 n = n + self.minute
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1021 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1022 n = n + self.second
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1023 return n * self.sign
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1024
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1025 def from_seconds(self, val):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1026 '''Figure my second, minute, hour and day values using a seconds
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1027 value.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1028 '''
2981
ad04cb95e2b0 fix Interval.from_seconds() with float argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2729
diff changeset
1029 val = int(val)
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1030 if val < 0:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1031 self.sign = -1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1032 val = -val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1033 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1034 self.sign = 1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1035 self.second = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1036 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1037 self.minute = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1038 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1039 self.hour = val % 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1040 val = val / 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1041 self.day = val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1042 self.month = self.year = 0
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1043
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1044 def setTranslator(self, translator):
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1045 """Replace the translation engine
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1046
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1047 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1048 is i18n module or one of gettext translation classes.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1049 It must have attributes 'gettext' and 'ngettext',
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1050 serving as translation functions.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1051 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1052 self.translator = translator
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1053 self._ = translator.gettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1054 self.ngettext = translator.ngettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1055
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1056
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1057 def fixTimeOverflow(time):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
1058 """ Handle the overflow in the time portion (H, M, S) of "time":
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1059 (sign, y,m,d,H,M,S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1060
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1061 Overflow and underflow will at most affect the _days_ portion of
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1062 the date. We do not overflow days to months as we don't know _how_
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1063 to, generally.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
1064 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1065 # XXX we could conceivably use this function for handling regular dates
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1066 # XXX too - we just need to interrogate the month/year for the day
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1067 # XXX overflow...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1068
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1069 sign, y, m, d, H, M, S = time
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1070 seconds = sign * (S + M*60 + H*60*60 + d*60*60*24)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1071 if seconds:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1072 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1073 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1074 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1075 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1076 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1077 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1078 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1079 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1080 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1081 months = y*12 + m
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1082 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1083 months *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1084 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1085 y = months/12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1086
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1087 return (sign, y, m, d, H, M, S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1088
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1089 class Range:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1090 """Represents range between two values
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1091 Ranges can be created using one of theese two alternative syntaxes:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1092
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1093 1. Native english syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1094
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1095 [[From] <value>][ To <value>]
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1096
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1097 Keywords "From" and "To" are case insensitive. Keyword "From" is
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1098 optional.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1099
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1100 2. "Geek" syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1101
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1102 [<value>][; <value>]
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1103
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1104 Either first or second <value> can be omitted in both syntaxes.
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1105
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1106 Examples (consider local time is Sat Mar 8 22:07:48 EET 2003)::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1107
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1108 make doctest think it's always 2000-06-26.00:34:02:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1109 >>> u = test_ini('2003-03-08.20:07:48.0')
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1110
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1111 >>> Range("from 2-12 to 4-2", Date)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1112 <Range from 2003-02-12.00:00:00 to 2003-04-02.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1113
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1114 >>> Range("18:00 to +2m", Date)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1115 <Range from 2003-03-08.18:00:00 to 2003-05-08.20:07:48>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1116
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1117 >>> Range("tO +3d", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1118 <Range from None to 2003-03-11.20:07:48>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1119
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1120 >>> Range("12:00 to", Date)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1121 <Range from 2003-03-08.12:00:00 to None>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1122
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1123 >>> Range("12:00;", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1124 <Range from 2003-03-08.12:00:00 to None>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1125
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1126 >>> Range("2002-11-10; 2002-12-12", Date)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1127 <Range from 2002-11-10.00:00:00 to 2002-12-12.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1128
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1129 >>> Range("; 20:00 +1d", Date)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1130 <Range from None to 2003-03-09.20:00:00>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1131
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1132 >>> Range("from 2003-02-16", Date)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1133 <Range from 2003-02-16.00:00:00 to None>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1134
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1135 >>> Range("2003-02-16;", Date)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1136 <Range from 2003-02-16.00:00:00 to None>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1137
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1138 Granularity tests:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1139
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1140 >>> Range("12:00", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1141 <Range from 2003-03-08.12:00:00 to 2003-03-08.12:00:59>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1142
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1143 >>> Range("2003-03-08", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1144 <Range from 2003-03-08.00:00:00 to 2003-03-08.23:59:59>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1145
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1146 >>> test_fin(u)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1147
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1148 Range of Interval tests
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1149
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1150 >>> Range ("from 0:50 to 2:00", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1151 <Range from + 0:50 to + 2:00>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1152 >>> Range ("from 0:50 to 1d 2:00", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1153 <Range from + 0:50 to + 1d 2:00>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1154 >>> Range ("from 5:50", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1155 <Range from + 5:50 to None>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1156 >>> Range ("to 0:05", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1157 <Range from None to + 0:05>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1158
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1159 """
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1160 def __init__(self, spec, Type, allow_granularity=True, **params):
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1161 """Initializes Range of type <Type> from given <spec> string.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1162
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1163 Sets two properties - from_value and to_value. None assigned to any of
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1164 this properties means "infinitum" (-infinitum to from_value and
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1165 +infinitum to to_value)
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1166
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1167 The Type parameter here should be class itself (e.g. Date), not a
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1168 class instance.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1169 """
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1170 self.range_type = Type
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1171 re_range = r'^(?:from)?(.+?)?to(.+?)?$'
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1172 re_range_no_to = r'^from(.+)(.)?$'
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1173 re_geek_range = r'^(.+?)?;(.+?)?$'
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1174 # Check which syntax to use
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1175 if ';' in spec:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1176 # Geek
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1177 m = re.search(re_geek_range, spec.strip())
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1178 else:
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1179 # Native english
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1180 m = re.search(re_range, spec.strip(), re.IGNORECASE)
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1181 if not m :
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1182 m = re.search(re_range_no_to, spec.strip(), re.IGNORECASE)
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1183 if m:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1184 self.from_value, self.to_value = m.groups()
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1185 if self.from_value:
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1186 self.from_value = Type(self.from_value.strip(), **params)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1187 if self.to_value:
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1188 self.to_value = Type(self.to_value.strip(), **params)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1189 else:
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1190 if allow_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1191 self.from_value = Type(spec, **params)
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1192 self.to_value = Type(spec, add_granularity=True, **params)
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1193 else:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1194 raise ValueError, "Invalid range"
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1195
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1196 def __str__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1197 return "from %s to %s" % (self.from_value, self.to_value)
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1198
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1199 def __repr__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1200 return "<Range %s>" % self.__str__()
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1201
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1202 def test_range():
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1203 rspecs = ("from 2-12 to 4-2", "from 18:00 TO +2m", "12:00;", "tO +3d",
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1204 "2002-11-10; 2002-12-12", "; 20:00 +1d", '2002-10-12')
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1205 rispecs = ('from -1w 2d 4:32 to 4d', '-2w 1d')
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1206 for rspec in rspecs:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1207 print '>>> Range("%s")' % rspec
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1208 print `Range(rspec, Date)`
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1209 print
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1210 for rspec in rispecs:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1211 print '>>> Range("%s")' % rspec
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1212 print `Range(rspec, Interval)`
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1213 print
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1214
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1215 def test():
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1216 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1217 for interval in intervals:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1218 print '>>> Interval("%s")'%interval
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1219 print `Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1220
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1221 dates = (".", "2000-06-25.19:34:02", ". + 2d", "1997-04-17", "01-25",
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1222 "08-13.22:13", "14:25", '2002-12')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1223 for date in dates:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1224 print '>>> Date("%s")'%date
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1225 print `Date(date)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1226
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1227 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1228 for date, interval in sums:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1229 print '>>> Date("%s") + Interval("%s")'%(date, interval)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1230 print `Date(date) + Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1231
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1232 if __name__ == '__main__':
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1233 test()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1234
3210
ea29d69f7415 fix error message formatting in Date.__init__;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3151
diff changeset
1235 # vim: set filetype=python sts=4 sw=4 et si :

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