annotate roundup/date.py @ 6814:3f60a71b0812

Summary: Support selecion session/otk data store. Add redis as data store. Allow admin to select the backend data store. Compatibility matrix: main\/ session>| anydbm | sqlite | redis | mysql | postgresql | anydbm | D | | X | | | sqlite | X | D | X | | | mysql | | | | D | | postgresql | | | | | D | --------------------------------------------------------------+ D - default if unconfigured, X - compatible choice DETAILS roundup/configuration.py: add config.ini section sessiondb with settings: backend and redis_url. CHANGES.txt, doc/admin_guide.txt, doc/installation.txt, doc/upgrading.txt: doc on config of session db and redis. Plus some other fixes: admin - clarified why we do not drop __words and __testids table in native-fts conversion. TYpo fix. upgrading - doc how you can keep using anydbm for session data with sqlite. Fix dupe sentence in an upgrading config.ini section. roundup/backends/back_anydbm.py, roundup/backends/back_sqlite.py: code to support redis, redis/anydbm backends respectively. roundup/backends/sessions_redis.py new storage backend for redis. roundup/rest.py, roundup/cgi/actions.py, roundup/cgi/templating.py redis uses a different way of calculating lifetime/timestamp. Since expiration of an item occurred if its timestamp was more than 1 week old, code would calculate: now - 1 week + lifetime. But this results in faster expiration in redis if used for lifetime/timestamp. Convert code to use the lifetime() method in BasicDatabase that generates the right timestamp for each backend. test/session_common.py: added tests for more cases, get without default, getall non-existing key etc. timestamp test changed to use new self.get_ts which is overridden in other tests. Test that datatypes survive storage. test/test_redis_session.py: test redis session store with sqlite and anydbm primary databases test/test_anydbm.py, test/test_sqlite.py add test to make sure the databases are properly set up sqlite - add test cases where anydbm is used as datastore anydbm - remove updateTimestamp override add get_ts(). test/test_config.py tests on redis_url and compatibility on choice of sessiondb backend .travis.yml: add redis db and redis-py
author John Rouillard <rouilj@ieee.org>
date Thu, 04 Aug 2022 14:41:58 -0400
parents d76291836523
children c27276e0bdce
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 """
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4991
diff changeset
20 from __future__ import print_function
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
21 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
23 import calendar
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
24 import datetime
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
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
32 try:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
33 cmp
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
34 except NameError:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
35 # Python 3.
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
36 def cmp(a, b):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
37 return (a > b) - (a < b)
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
38
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
39 from roundup import i18n
5438
e2382945d302 Python 3 preparation: avoid basestring.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5414
diff changeset
40 from roundup.anypy.strings import is_us
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
41
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 # 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
43 # 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
44 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
45 ((?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
46 |(?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
47 (?P<n>\.)? # .
3611
86d568dbab55 allow single digit seconds in date spec [SF#1447141]
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
48 (((?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
49 (?:(?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
50 $''', 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
51 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
52 (\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
53 ''', 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
54
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
55 _timedelta0 = datetime.timedelta(0)
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 # load UTC tzinfo
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
58 if pytz:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
59 UTC = pytz.utc
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
60 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
61 # 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
62
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
63 class _UTC(datetime.tzinfo):
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 """Universal Coordinated Time zoneinfo"""
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
66
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
67 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
68 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
69
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
70 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
71 return "UTC"
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
72
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
73 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
74 return _timedelta0
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 __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
77 return "<UTC>"
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 # pytz adjustments interface
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
80 # 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
81 # 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
82 # 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
83
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
84 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
85 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
86
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
87 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
88 return dt.replace(tzinfo=self)
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 UTC = _UTC()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
91
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
92
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
93 # 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
94 # 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
95 class SimpleTimezone(datetime.tzinfo):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
96
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
97 """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
98
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
99 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
100 super(SimpleTimezone, self).__init__()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
101 self.offset = offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
102 if name:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
103 self.name = name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
104 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
105 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
106
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
107 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
108 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
109
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
110 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
111 return self.name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
112
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
113 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
114 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
115
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
116 def __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
117 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
118
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
119 # pytz adjustments interface
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 normalize(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
122 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
123
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
124 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
125 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
126
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
127
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
128 # simple timezones with fixed offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
129 _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
130
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
131
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
132 def get_timezone(tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
133 # 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
134 # 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
135 if tz is None:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
136 return None
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
137 # 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
138 try:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
139 utcoffset = int(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
140 except (TypeError, ValueError):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
141 pass
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
142 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
143 if utcoffset == 0:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
144 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
145 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
146 return SimpleTimezone(utcoffset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
147 # tz is a timezone name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
148 if pytz:
6380
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
149 try:
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
150 return pytz.timezone(tz)
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
151 except pytz.exceptions.UnknownTimeZoneError:
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
152 pass
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
153
d76291836523 Fix issue2551128 - Impossible to validate a user with unknown timezone
John Rouillard <rouilj@ieee.org>
parents: 6193
diff changeset
154 if tz == "UTC":
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
155 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
156 elif tz in _tzoffsets:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
157 return SimpleTimezone(_tzoffsets[tz], tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
158 else:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
159 raise KeyError(tz)
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
160
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
161
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
162 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
163 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
164 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
165 frac = S - int(S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
166 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
167 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
168 S = S + frac
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
169 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
170
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
171
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
172 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
173 TZ = get_timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
174 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
175 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
176 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
177
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
178
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
179 def test_ini(t):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
180 """ 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
181 """
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
182 u = Date.now
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
183 d = datetime.datetime.strptime(t, '%Y-%m-%d.%H:%M:%S.%f')
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
184 Date.now = lambda x: d
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
185 return u
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
186
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
187
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
188 def test_fin(u):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
189 """ Undo monkey patch above
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
190 """
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
191 Date.now = u
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
192
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
193
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 class Date:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 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
197 international standard format (yyyy-mm-dd) joined to the time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 (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
199 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
200 "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
201 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
202 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
203 always exactly 19 characters long.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 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
206 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
207 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
208 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
209 care of these conversions. In the following examples, suppose that yyyy
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 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
211 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
212
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
213 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
214 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
215 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
216 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
217 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
218 configured. In the following examples the timezone correction for
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
219 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
220 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
221
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
222 Examples::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
224
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
225 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
226 >>> 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
227
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
228 >>> Date("2000-04-17-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
229 <Date 2000-04-17.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
230 >>> Date("01-25-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
231 <Date 2000-01-25.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
232 >>> Date("2000-04-17.03:45-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
233 <Date 2000-04-17.08:45:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
234 >>> Date("08-13.22:13-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
235 <Date 2000-08-14.03:13:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
236 >>> Date("11-07.09:32:43-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
237 <Date 2000-11-07.14:32:43.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
238 >>> Date("14:25-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
239 <Date 2000-06-26.19:25:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
240 >>> Date("8:47:11-0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
241 <Date 2000-06-26.13:47:11.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
242 >>> Date("2003 -0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
243 <Date 2003-01-01.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
244 >>> Date("2003-06 -0500")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
245 <Date 2003-06-01.05:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
246
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
247 "." means "right now":
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
248 >>> Date(".")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
249 <Date 2000-06-26.00:34:02.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
250
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
251 >>> test_fin(u)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 The Date class should understand simple date expressions of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 stamp + interval and stamp - interval. When adding or subtracting
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 intervals involving months or years, the components are handled
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 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
258 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
259 or 41 days). Example usage::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
261 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
262 >>> 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
263
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 >>> Date(".")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
265 <Date 2000-06-26.00:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 >>> _.local(-5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
267 <Date 2000-06-25.19:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 >>> Date(". + 2d")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
269 <Date 2000-06-28.00:34:02.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 >>> Date("1997-04-17", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
271 <Date 1997-04-17.05:00:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 >>> Date("01-25", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
273 <Date 2000-01-25.05:00:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 >>> Date("08-13.22:13", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
275 <Date 2000-08-14.03:13:00.000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 >>> Date("14:25", -5)
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
277 <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
278
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
279 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
280 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
281 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
282
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
283 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
284 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
285 number as in the RFC 2822 date format.
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
286 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
287 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
288 Coordinated Universal Time (UTC). The "+" or "-" sign indicate whether
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
289 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
290 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
291 constructor. Examples::
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
292
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
293 >>> Date ("2000-08-14+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
294 <Date 2000-08-13.22:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
295 >>> Date ("08-15.22:00+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
296 <Date 2000-08-15.20:00:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
297 >>> Date ("08-15.22:47+0200")
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
298 <Date 2000-08-15.20:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
299 >>> Date ("08-15.22:47+0200", offset = 5)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
300 <Date 2000-08-15.20:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
301 >>> Date ("08-15.22:47", offset = 5)
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
302 <Date 2000-08-15.17:47:00.000>
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
303
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
304 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
305 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
306
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
307 >>> 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
308 >>> d1=Date('.')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
309 >>> d1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
310 <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
311 >>> d2=Date('2003-07-01')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
312 >>> d2
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
313 <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
314 >>> d1-d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
315 <Interval + 280d 22:04:20>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
316 >>> i1=_
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
317 >>> d2+i1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
318 <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
319 >>> d1-i1
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
320 <Date 2003-07-01.00:00:00.000>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
321
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
322 >>> test_fin(u)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 '''
2262
a13ec40cf8f5 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2250
diff changeset
324
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
325 def __init__(self, spec='.', offset=0, add_granularity=False,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
326 translator=i18n):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 """Construct a date given a specification and a time zone offset.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
329 'spec'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
330 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
331 subtracted interval. Or a date 9-tuple.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
332 'offset'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
333 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
334 'translator'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
335 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
336 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
337 serving as translation functions.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
339 self.setTranslator(translator)
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
340 # Python 2.3+ datetime object
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
341 # common case when reading from database: avoid double-conversion
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
342 if isinstance(spec, datetime.datetime):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
343 if offset == 0:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
344 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
345 self.second = spec.timetuple()[:6]
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
346 else:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
347 TZ = get_timezone(tz)
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
348 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
349 self.second = TZ.localize(spec).utctimetuple()[:6]
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
350 self.second += spec.microsecond/1000000.
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
351 return
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4465
diff changeset
352
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
353 if isinstance(spec, type('')):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
354 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
355 return
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
356 elif hasattr(spec, 'tuple'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
357 spec = spec.tuple()
2539
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
358 elif isinstance(spec, Date):
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
359 spec = spec.get_tuple()
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
360 try:
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
361 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
362 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
363 frac = S - int(S)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 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
365 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
366 # we lost the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
367 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
368 # 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
369 self.second = min(self.second, 59.999)
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
370 except Exception:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
371 raise ValueError('Unknown spec %r' % (spec,))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
373 def now(self):
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
374 """ To be able to override for testing
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
375 """
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
376 return datetime.datetime.utcnow()
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
377
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
378 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
379 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
380 ''' 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
381 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
382
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
383 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
384 if m is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
385 # we're serialised - easy!
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
386 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
387 (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
388 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
389 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
390 return
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
391
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
392 # 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
393 m = date_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
394 if m is None:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
395 raise ValueError(self._('Not a date spec: %r '
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
396 '("yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
397 '"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
398
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
399 info = m.groupdict()
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
400
4072
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
401 # If add_granularity is true, construct the maximum time given
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
402 # the precision of the input. For example, given the input
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
403 # "12:15", construct "12:15:59". Or, for "2008", construct
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
404 # "2008-12-31.23:59:59".
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
405 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
406 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
407 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
408 if gran == 'S':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
409 raise ValueError
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
410 elif gran == 'M':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
411 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
412 elif gran == 'H':
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
413 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
414 else:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
415 add_granularity = Interval('+1%s' % gran)
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
416 break
4072
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
417 else:
d5e2767d4e91 Robustify Date.set.
Stefan Seefeld <stefan@seefeld.name>
parents: 3954
diff changeset
418 raise ValueError(self._('Could not determine granularity'))
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
419
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
420 # get the current date as our default
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
421 dt = self.now()
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
422 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
423 S += dt.microsecond/1000000.
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
424
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
425 # 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
426 adjust = False
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
427
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
428 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
429 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
430 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
431 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
432 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
433 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
434 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
435 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
436 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
437 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
438 d = int(info['b'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
439 H = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
440 M = S = 0
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
441 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
442
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
443 # override hour, minute, second parts
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
444 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
445 H = int(info['H'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
446 M = int(info['M'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
447 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
448 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
449 S = float(info['S'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
450 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
451
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
452 if info.get('tz', None):
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
453 offset = 0
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
454
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
455 # 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
456 frac = S - int(S)
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
457 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
458 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
459 if adjust:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
460 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
461 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
462 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
463 # 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
464 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
465
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
466 if info.get('o', None):
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
467 try:
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
468 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
469 except ValueError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
470 raise ValueError(self._('%r not a date / time spec '
3151
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
471 '"yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
472 '"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
473
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
474 if info.get('tz', None):
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
475 tz = info['tz'].strip()
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
476 sign = [-1, 1][tz[0] == '-']
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
477 minute = int(tz[3:], 10)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
478 hour = int(tz[1:3], 10)
4986
fe140bc0eaa9 Implement (and document) timezone offsets
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4985
diff changeset
479 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
480
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
481 # 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
482 if add_granularity:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
483 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
484 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
485
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
486 def addInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
487 ''' Add the interval to this date, returning the date tuple
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488 '''
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
489 # 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
490 sign = interval.sign
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
491 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
492 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
493 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
494 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
495 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
496 # 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
497 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
498
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
499 # now cope with under- and over-flow
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
500 # first do the time
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
501 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
502 hour < 0 or hour > 23):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
503 if second < 0: minute -= 1; second += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
504 elif second > 59: minute += 1; second -= 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
505 if minute < 0: hour -= 1; minute += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
506 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
507 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
508 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
509
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
510 # 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
511 while month < 1 or month > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
512 if month < 1: year -= 1; month += 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
513 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
514
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
515 # 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
516 def get_mdays(year, month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
517 if month == 2 and calendar.isleap(year): return 29
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
518 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
519
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
520 while month < 1 or month > 12 or day < 1 or \
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
521 day > get_mdays(year, month):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
522 # 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
523 if day < 1:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
524 # When going backwards, decrement month, then increment days
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
525 month -= 1
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
526 day += get_mdays(year, month)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
527 elif day > get_mdays(year, month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
528 # When going forwards, decrement days, then increment month
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
529 day -= get_mdays(year, month)
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
530 month += 1
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
531
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
532 # 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
533 while month < 1 or month > 12:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
534 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
535 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
536
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
537 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
538
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
539 def differenceDate(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
540 "Return the difference between this date and another date"
2189
d39068bc6ef9 implement differenceDate ;)
Richard Jones <richard@users.sourceforge.net>
parents: 2188
diff changeset
541 return self - other
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
542
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
543 def applyInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
544 ''' 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
545 '''
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
546 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
547 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
548
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
549 def __add__(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
550 """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
551 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
552 return Date(self.addInterval(interval), translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
553
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1094
diff changeset
554 # deviates from spec to allow subtraction of dates as well
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
555 def __sub__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
556 """ Subtract:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
557 1. an interval from this date to produce another date.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
558 2. a date from this date to produce an interval.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 """
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
560 if isinstance(other, Interval):
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
561 other = Interval(other.get_tuple())
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
562 other.sign *= -1
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
563 return self.__add__(other)
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
564
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
565 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
566
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
567 return self.dateDelta(other)
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
568
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
569 def dateDelta(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
570 """ Produce an Interval of the difference between this date
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
571 and another date. Only returns days:hours:minutes:seconds.
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
572 """
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
573 # Returning intervals larger than a day is almost
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
574 # 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
575 a = calendar.timegm((self.year, self.month, self.day, self.hour,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
576 self.minute, self.second, 0, 0, 0))
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
577 b = calendar.timegm((other.year, other.month, other.day,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
578 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
579 # 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
580 diff = int(a - b)
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
581 if diff > 0:
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
582 sign = 1
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
583 else:
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
584 sign = -1
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
585 diff = -diff
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
586 S = diff % 60
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
587 M = (diff//60) % 60
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
588 H = (diff//(60*60)) % 24
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
589 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
590 return Interval((0, 0, d, H, M, S), sign=sign,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
591 translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
593 def __cmp__(self, other, int_seconds=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 """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
595 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
596 return 1
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
597 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
598 if not hasattr(other, attr):
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
599 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 r = cmp(getattr(self, attr), getattr(other, attr))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601 if r: return r
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
602 if not hasattr(other, 'second'):
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
603 return 1
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
604 if int_seconds:
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
605 return cmp(int(self.second), int(other.second))
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
606 return cmp(self.second, other.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
608 def __lt__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
609 return self.__cmp__(other) < 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
610
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
611 def __le__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
612 return self.__cmp__(other) <= 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
613
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
614 def __eq__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
615 return self.__cmp__(other) == 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
616
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
617 def __ne__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
618 return self.__cmp__(other) != 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
619
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
620 def __gt__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
621 return self.__cmp__(other) > 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
622
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
623 def __ge__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
624 return self.__cmp__(other) >= 0
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
625
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
626 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
627 """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
628 return self.formal()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
629
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
630 def formal(self, sep='.', sec='%02d'):
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
631 f = '%%04d-%%02d-%%02d%s%%02d:%%02d:%s' % (sep, sec)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
632 return f % (self.year, self.month, self.day, self.hour, self.minute,
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
633 self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634
5637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
635 def isoformat(self):
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
636 ''' Represent the date/time in isoformat standard
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
638 Originally needed for xml output support using
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
639 dicttoxml in the rest interface.
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
640 '''
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
641 f = '%%04d-%%02d-%%02d%s%%02d:%%02d:%s' % ("T", "%02.6d")
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
642 return f % (self.year, self.month, self.day, self.hour, self.minute,
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
643 self.second)
5637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
644
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
645 def pretty(self, format='%d %B %Y'):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
646 ''' 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
647
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
648 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
649 format, then the day number will be removed from output.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
650 '''
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
651 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
652 self.minute, int(self.second),
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
653 int((self.second - int(self.second)) * 1000000.))
3822
2a60b68985db Fix arbitrary limit on dates.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3798
diff changeset
654 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
655
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
656 # handle zero day by removing it
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
657 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
658 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
659 return str
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
660
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
661 def __repr__(self):
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
662 return '<Date %s>' % self.formal(sec='%06.3f')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 def local(self, offset):
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
665 """ 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
666 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
667 """
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
668 y,m,d,H,M,S = _utc_to_local(self.year, self.month, self.day,
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
669 self.hour, self.minute, self.second, offset)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
670 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
671
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
672 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
673 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
674 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
675
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
676 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
677 return (self.year, self.month, self.day, self.hour, self.minute,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
678 self.second, 0, 0, 0)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
679
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
680 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
681 """ 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
682
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
683 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
684 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
685 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
686
8ab5d7d63191 Fixed issue2550802: Fixed date so second fraction can't cause rounding to
Bernhard Reiter <bernhard@intevation.de>
parents: 4570
diff changeset
687 """
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
688 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
689 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
690
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
691 def timestamp(self):
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
692 ''' 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
693 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
694 ts = calendar.timegm((self.year, self.month, self.day, self.hour,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
695 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
696 # we lose the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
697 return ts + frac
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
698
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
699 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
700 """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
701
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
702 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
703 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
704 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
705 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
706 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
707 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
708 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
709 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
710
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
711 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
712 """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
713
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
714 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
715 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
716 """
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
717 usec = int((ts - int(ts)) * 1000000.)
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
718 delta = datetime.timedelta(seconds=int(ts), microseconds=usec)
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
719 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
720 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
721
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
722
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
723 class Interval:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
724 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
725 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
726 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
727 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
728 may not).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
730 "3y" means three years
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
731 "2y 1m" means two years and one month
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
732 "1m 25d" means one month and 25 days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 "2w 3d" means two weeks and three days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
734 "1d 2:50" means one day, two hours, and 50 minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
735 "14:00" means 14 hours
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
736 "0:04:33" means four minutes and 33 seconds
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
738 Example usage:
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
739 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
740 >>> 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
741
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
742 >>> Interval(" 3w 1 d 2:00")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
743 <Interval + 22d 2:00>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
744 >>> Date(". + 2d") + Interval("- 3w")
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
745 <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
746 >>> Interval('1:59:59') + Interval('00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
747 <Interval + 2:00>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
748 >>> Interval('2:00') + Interval('- 00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
749 <Interval + 1:59:59>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
750 >>> Interval('1y')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
751 <Interval + 6m>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
752 >>> Interval('1:00')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
753 <Interval + 0:30>
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
754
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
755 [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
756 >>> Interval('2003-03-18')
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
757 <Interval - 995d>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
758
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
759 [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
760 >>> Interval('-4d 2003-03-18')
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
761 <Interval - 991d>
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
762
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
763 >>> test_fin(u)
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
764
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
765 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
766 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
767 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
768 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
769 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
770
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
771 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
772 seconds, minutes, hours, years, months, days
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
773
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
774 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
775 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
776 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
777
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
778 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
779 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
780 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
781
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
782 TODO: more examples, showing the order of addition operation
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
783 '''
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
784 def __init__(self, spec, sign=1, allowdate=1, add_granularity=False,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
785 translator=i18n):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
786 """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
787 self.setTranslator(translator)
5394
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
788 try:
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
789 # Python 2.
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
790 arith_types = (int, float, long)
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
791 except NameError:
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
792 # Python 3.
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
793 arith_types = (int, float)
c26d88ec071e Python 3 preparation: handle absence of "long" type.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5380
diff changeset
794 if isinstance(spec, arith_types):
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
795 self.from_seconds(spec)
5438
e2382945d302 Python 3 preparation: avoid basestring.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5414
diff changeset
796 elif is_us(spec):
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
797 self.set(spec, allowdate=allowdate,
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
798 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
799 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
800 (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
801 self.minute, self.second) = spec.get_tuple()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
802 else:
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
803 if len(spec) == 7:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
804 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
805 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
806 self.second = int(self.second)
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
807 else:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
808 # old, buggy spec form
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
809 self.sign = sign
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
810 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
811 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
812 self.second = int(self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
813
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
814 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
815 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
816 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
817
5809
936275dfe1fa Try to fix:
John Rouillard <rouilj@ieee.org>
parents: 5637
diff changeset
818 def set(self, spec, allowdate=1, interval_re=re.compile(r'''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
819 \s*(?P<s>[-+])? # + or -
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
820 \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
821 \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
822 \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
823 \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
824 \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
825 \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
826 (\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
827 \.? # .
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
828 (\d?\d:\d\d)?(:\d\d)? # hh:mm:ss
5811
7d276bb8b46d More invalid escape sequence fixes.
John Rouillard <rouilj@ieee.org>
parents: 5809
diff changeset
829 )?''', re.VERBOSE), serialised_re=re.compile(r'''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
830 (?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
831 (?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
832 add_granularity=False):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
833 ''' 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
834 '''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
835 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
836 self.minute = self.second = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
837 self.sign = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
838 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
839 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
840 m = interval_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
841 if not m:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
842 raise ValueError(self._('Not an interval spec: "%s"'
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
843 ' ([+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS] [date spec])'
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
844 % spec))
1542
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
845 else:
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
846 allowdate = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
847
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
848 # 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
849 info = m.groupdict()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
850 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
851 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
852 if info[gran] is not None:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
853 info[gran] = int(info[gran]) + (info['s'] == '-' and -1 or 1)
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
854 break
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
855
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
856 valid = 0
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
857 for group, attr in {'y': 'year', 'm': 'month', 'w': 'week', 'd': 'day',
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
858 'H': 'hour', 'M': 'minute', 'S': 'second'}.items():
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
859 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
860 valid = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
861 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
862
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
863 # 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
864 if not valid and not info['D']:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
865 raise ValueError(self._('Not an interval spec: "%s"'
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
866 ' ([+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS])'
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
867 % spec))
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
868
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
869 if self.week:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
870 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
871
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
872 if info['s'] is not None:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
873 self.sign = {'+': 1, '-': -1}[info['s']]
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
874
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
875 # 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
876 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
877 now = Date('.')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
878 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
879 # 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
880 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
881 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
882 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
883 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
884 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
885
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
886 def __lt__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
887 """Compare this interval to another interval."""
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
888
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
889 if other is None:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
890 # we are always larger than None
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
891 return False
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
892 return self.as_seconds() < other.as_seconds()
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
893
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
894 def __le__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
895 """Compare this interval to another interval."""
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
896
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
897 if other is None:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
898 # we are always larger than None
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
899 return False
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
900 return self.as_seconds() <= other.as_seconds()
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
901
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
902 def __eq__(self, other):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
903 """Compare this interval to another interval."""
4461
5f82173d1684 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4422
diff changeset
904
4465
605f31a596b8 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4461
diff changeset
905 if other is None:
605f31a596b8 Simplify and fix interval comparison.
Stefan Seefeld <stefan@seefeld.name>
parents: 4461
diff changeset
906 # we are always larger than None
5414
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
907 return False
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
908 return self.as_seconds() == other.as_seconds()
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
909
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
910 def __ne__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
911 """Compare this interval to another interval."""
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
912
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
913 if other is None:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
914 # we are always larger than None
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
915 return True
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
916 return self.as_seconds() != other.as_seconds()
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
917
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
918 def __gt__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
919 """Compare this interval to another interval."""
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
920
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
921 if other is None:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
922 # we are always larger than None
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
923 return True
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
924 return self.as_seconds() > other.as_seconds()
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
925
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
926 def __ge__(self, other):
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
927 """Compare this interval to another interval."""
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
928
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
929 if other is None:
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
930 # we are always larger than None
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
931 return True
3fa026621f69 Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
932 return 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
933
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
934 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
935 """Return this interval as a string."""
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
936 l = []
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
937 if self.year: l.append('%sy' % self.year)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
938 if self.month: l.append('%sm' % self.month)
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
939 if self.day: l.append('%sd' % self.day)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940 if self.second:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
941 l.append('%d:%02d:%02d' % (self.hour, self.minute, self.second))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
942 elif self.hour or self.minute:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
943 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
944 if l:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
945 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
946 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
947 l.append('00:00')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
948 return ' '.join(l)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
949
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
950 def __add__(self, other):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
951 if isinstance(other, Date):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
952 # 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
953 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
954 elif isinstance(other, Interval):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
955 # add the other Interval to this one
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
956 a = self.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
957 asgn = a[0]
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
958 b = other.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
959 bsgn = b[0]
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
960 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
961 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
962 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
963 return Interval(i, translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
964 # nope, no idea what to do with this other...
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
965 raise TypeError("Can't add %r" % other)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
966
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
967 def __sub__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
968 if isinstance(other, Date):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
969 # the other is a Date - produce a Date
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
970 interval = Interval(self.get_tuple())
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
971 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
972 return Date(other.addInterval(interval),
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
973 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
974 elif isinstance(other, Interval):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
975 # add the other Interval to this one
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
976 a = self.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
977 asgn = a[0]
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
978 b = other.get_tuple()
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3619
diff changeset
979 bsgn = b[0]
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
980 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
981 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
982 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
983 return Interval(i, translator=self.translator)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
984 # nope, no idea what to do with this other...
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
985 raise TypeError("Can't add %r" % other)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
986
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
987 def __truediv__(self, other):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
988 """ Divide this interval by an int value.
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
989
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
990 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
991 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
992 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
993 try:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
994 other = float(other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
995 except TypeError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
996 raise ValueError("Can only divide Intervals by numbers")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
997
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
998 y, m, d, H, M, S = (self.year, self.month, self.day,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
999 self.hour, self.minute, self.second)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1000 if y or m:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1001 if d or H or M or S:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
1002 raise ValueError("Can't divide Interval with date and time")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1003 months = self.year*12 + self.month
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1004 months *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1005
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1006 months = int(months/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1007
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1008 sign = months < 0 and -1 or 1
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1009 m = months % 12
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1010 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
1011 return Interval((sign, y, m, 0, 0, 0, 0),
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1012 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1013
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1014 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1015 # handle a day/time division
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1016 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
1017 seconds *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1018
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1019 seconds = int(seconds/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1020
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1021 sign = seconds < 0 and -1 or 1
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1022 seconds *= sign
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1023 S = seconds % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1024 seconds //= 60
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1025 M = seconds % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1026 seconds //= 60
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1027 H = seconds % 24
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1028 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
1029 return Interval((sign, 0, 0, d, H, M, S),
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1030 translator=self.translator)
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1031 # Python 2 compatibility:
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1032 __div__ = __truediv__
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1033
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1034 def __repr__(self):
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1035 return '<Interval %s>' % self.__str__()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1036
487
2f4c37d28108 I18N'ification
Richard Jones <richard@users.sourceforge.net>
parents: 406
diff changeset
1037 def pretty(self):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1038 ''' print up the date date using one of these nice formats..
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1039 '''
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1040 _quarters = self.minute // 15
720
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
1041 if self.year:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1042 s = self.ngettext("%(number)s year", "%(number)s years",
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1043 self.year) % {'number': self.year}
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1044 elif self.month or self.day > 28:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
1045 _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
1046 s = self.ngettext("%(number)s month", "%(number)s months",
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1047 _months) % {'number': _months}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1048 elif self.day > 7:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1049 _weeks = int(self.day / 7)
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1050 s = self.ngettext("%(number)s week", "%(number)s weeks",
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1051 _weeks) % {'number': _weeks}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1052 elif self.day > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1053 # 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
1054 s = self.ngettext('%(number)s day', '%(number)s days',
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1055 self.day) % {'number': self.day}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1056 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
1057 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1058 return self._('tomorrow')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1059 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1060 return self._('yesterday')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1061 elif self.hour > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1062 # 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
1063 s = self.ngettext('%(number)s hour', '%(number)s hours',
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1064 self.hour) % {'number': self.hour}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1065 elif self.hour == 1:
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1066 if self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1067 s = self._('an hour')
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1068 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1069 s = self._('1 1/2 hours')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1070 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1071 s = self.ngettext('1 %(number)s/4 hours',
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1072 '1 %(number)s/4 hours',
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1073 _quarters) % {'number': _quarters}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1074 elif self.minute < 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1075 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1076 return self._('in a moment')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1077 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1078 return self._('just now')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1079 elif self.minute == 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1080 # 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
1081 s = self._('1 minute')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1082 elif self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1083 # 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
1084 s = self.ngettext('%(number)s minute', '%(number)s minutes',
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1085 self.minute) % {'number': self.minute}
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1086 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1087 s = self._('1/2 an hour')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1088 else:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
1089 s = self.ngettext('%(number)s/4 hour', '%(number)s/4 hours',
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1090 _quarters) % {'number': _quarters}
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1091 # XXX this is internationally broken
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1092 if self.sign < 0:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1093 s = self._('%s ago') % s
1413
4ae9d725bec4 make future intervals obvious too
Richard Jones <richard@users.sourceforge.net>
parents: 1412
diff changeset
1094 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1095 s = self._('in %s') % s
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
1096 return s
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1097
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
1098 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
1099 return (self.sign, self.year, self.month, self.day, self.hour,
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1100 self.minute, self.second)
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1101
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
1102 def serialise(self):
1261
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
1103 sign = self.sign > 0 and '+' or '-'
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1104 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
1105 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
1106
5637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1107 def isoformat(self):
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1108 '''Represent interval as an ISO 8061 duration (absolute value)
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1109
5637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1110 Originally needed for xml output support using
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1111 dicttoxml in the rest interface.
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1112 '''
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1113 return 'P%04dY%02dM%02dDT%02dH%02dM%02dS' % (self.year, self.month,
5637
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1114 self.day, self.hour, self.minute, self.second)
43970d92323e Add two isoformat() methods. One for Date and one for Interval.
John Rouillard <rouilj@ieee.org>
parents: 5438
diff changeset
1115
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1116 def as_seconds(self):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1117 '''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
1118
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1119 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
1120 int.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1121 '''
5380
64c4e43fbb84 Python 3 preparation: numeric literal syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1122 n = self.year * 365
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1123 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
1124 n = n + self.day
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1125 n = n * 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1126 n = n + self.hour
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1127 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1128 n = n + self.minute
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1129 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1130 n = n + self.second
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1131 return n * self.sign
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1132
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1133 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
1134 '''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
1135 value.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1136 '''
2981
ad04cb95e2b0 fix Interval.from_seconds() with float argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2729
diff changeset
1137 val = int(val)
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1138 if val < 0:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1139 self.sign = -1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1140 val = -val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1141 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1142 self.sign = 1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1143 self.second = val % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1144 val = val // 60
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1145 self.minute = val % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1146 val = val // 60
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1147 self.hour = val % 24
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1148 val = val // 24
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1149 self.day = val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1150 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
1151
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1152 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
1153 """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
1154
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1155 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1156 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
1157 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
1158 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
1159 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
1160 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
1161 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
1162 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
1163
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
1164
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1165 def fixTimeOverflow(time):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
1166 """ 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
1167 (sign, y,m,d,H,M,S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1168
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1169 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
1170 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
1171 to, generally.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
1172 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1173 # 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
1174 # 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
1175 # XXX overflow...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1176
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1177 sign, y, m, d, H, M, S = time
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1178 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
1179 if seconds:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1180 sign = seconds < 0 and -1 or 1
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1181 seconds *= sign
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1182 S = seconds % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1183 seconds //= 60
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1184 M = seconds % 60
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1185 seconds //= 60
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1186 H = seconds % 24
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1187 d = seconds // 24
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1188 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1189 months = y*12 + m
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1190 sign = months < 0 and -1 or 1
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1191 months *= sign
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1192 m = months % 12
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5394
diff changeset
1193 y = months//12
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1194
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1195 return (sign, y, m, d, H, M, S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
1196
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1197
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1198 class Range:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1199 """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
1200 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
1201
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1202 1. Native english syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1203
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1204 [[From] <value>][ To <value>]
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1205
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1206 Keywords "From" and "To" are case insensitive. Keyword "From" is
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1207 optional.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1208
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1209 2. "Geek" syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1210
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1211 [<value>][; <value>]
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1212
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1213 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
1214
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
1215 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
1216
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1217 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
1218 >>> 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
1219
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1220 >>> 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
1221 <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
1222
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1223 >>> 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
1224 <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
1225
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1226 >>> Range("tO +3d", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1227 <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
1228
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1229 >>> 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
1230 <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
1231
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1232 >>> Range("12:00;", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1233 <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
1234
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1235 >>> 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
1236 <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
1237
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1238 >>> 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
1239 <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
1240
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1241 >>> Range("from 2003-02-16", Date)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1242 <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
1243
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1244 >>> Range("2003-02-16;", Date)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1245 <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
1246
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1247 Granularity tests:
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1248
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1249 >>> Range("12:00", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1250 <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
1251
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1252 >>> Range("2003-03-08", Date)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1253 <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
1254
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1255 >>> test_fin(u)
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1256
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1257 Range of Interval tests
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1258
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1259 >>> 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
1260 <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
1261 >>> 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
1262 <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
1263 >>> Range ("from 5:50", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1264 <Range from + 5:50 to None>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1265 >>> Range ("to 0:05", Interval)
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1266 <Range from None to + 0:05>
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1267
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1268 """
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1269 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
1270 """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
1271
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1272 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
1273 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
1274 +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
1275
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1276 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
1277 class instance.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1278 """
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1279 self.range_type = Type
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1280 re_range = r'^(?:from)?(.+?)?to(.+?)?$'
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1281 re_range_no_to = r'^from(.+)(.)?$'
4985
07c59221f363 Make doctests run in date module
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4856
diff changeset
1282 re_geek_range = r'^(.+?)?;(.+?)?$'
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1283 # 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
1284 if ';' in spec:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1285 # Geek
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1286 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
1287 else:
3954
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1288 # Native english
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1289 m = re.search(re_range, spec.strip(), re.IGNORECASE)
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1290 if not m:
4991
03505579abef Fix bug in (Date- or Interval-) Range parsing
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4986
diff changeset
1291 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
1292 if m:
3d5a0a949107 Fix granularity stuff so it handles wrapping a lot better.
Richard Jones <richard@users.sourceforge.net>
parents: 3953
diff changeset
1293 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
1294 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
1295 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
1296 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
1297 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
1298 else:
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1299 if allow_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1300 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
1301 self.to_value = Type(spec, add_granularity=True, **params)
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1302 else:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
1303 raise ValueError("Invalid range")
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1304
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1305 def __str__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1306 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
1307
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1308 def __repr__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1309 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
1310
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1311
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1312 def test_range():
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1313 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
1314 "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
1315 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
1316 for rspec in rspecs:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4991
diff changeset
1317 print('>>> Range("%s")' % rspec)
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
1318 print(repr(Range(rspec, Date)))
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4991
diff changeset
1319 print()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1320 for rspec in rispecs:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4991
diff changeset
1321 print('>>> Range("%s")' % rspec)
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
1322 print(repr(Range(rspec, Interval)))
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4991
diff changeset
1323 print()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1324
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1325
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1326 def test():
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1327 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1328 for interval in intervals:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1329 print('>>> Interval("%s")' % interval)
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
1330 print(repr(Interval(interval)))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1331
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1332 dates = (".", "2000-06-25.19:34:02", ". + 2d", "1997-04-17", "01-25",
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1333 "08-13.22:13", "14:25", '2002-12')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1334 for date in dates:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1335 print('>>> Date("%s")' % date)
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
1336 print(repr(Date(date)))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1337
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1338 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1339 for date, interval in sums:
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1340 print('>>> Date("%s") + Interval("%s")' % (date, interval))
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
1341 print(repr(Date(date) + Interval(interval)))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1342
6193
69b1aaf9c51f pep8 changes,
John Rouillard <rouilj@ieee.org>
parents: 5811
diff changeset
1343
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1344 if __name__ == '__main__':
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1345 test()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1346
3210
ea29d69f7415 fix error message formatting in Date.__init__;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3151
diff changeset
1347 # vim: set filetype=python sts=4 sw=4 et si :

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