[Zope3-checkins] CVS: Zope3/lib/python/Zope/Misc - DateTimeParse.py:1.3.2.1
Jim Fulton
jim@zope.com
Thu, 3 Oct 2002 18:17:22 -0400
Update of /cvs-repository/Zope3/lib/python/Zope/Misc
In directory cvs.zope.org:/tmp/cvs-serv27190/lib/python/Zope/Misc
Modified Files:
Tag: ZopeDublinCore-branch
DateTimeParse.py
Log Message:
Checking in still-unfinished dublin core work on
ZopeDublinCore-branch.
To do:
- Make a number of existing tests work now that a lot of views
need to generate events. (Perhaps these will need to
be factored into adapters and views. Sigh.)
- Make object events able to compute locations for there
objects when an location hasn't been provided to the constructor.
- Add some UI for editing at least some meta data.
Handling of lists (e.g. subjects, creators) may need some more thought
as these will often want to come from standard system-provided lists.
=== Zope3/lib/python/Zope/Misc/DateTimeParse.py 1.3 => 1.3.2.1 ===
--- Zope3/lib/python/Zope/Misc/DateTimeParse.py:1.3 Thu Jul 18 12:07:02 2002
+++ Zope3/lib/python/Zope/Misc/DateTimeParse.py Thu Oct 3 18:16:52 2002
@@ -400,7 +400,7 @@
class DateTimeParser:
- def parse(self, arg):
+ def parse(self, arg, local=1):
"""Parse a string containing some sort of date-time data
As a general rule, any date-time representation that is
@@ -470,7 +470,7 @@
if arg.find(' ')==-1 and arg[4]=='-':
yr,mo,dy,hr,mn,sc,tz=self._parse_iso8601(arg)
else:
- yr,mo,dy,hr,mn,sc,tz=self._parse(arg)
+ yr,mo,dy,hr,mn,sc,tz=self._parse(arg, local)
if not self._validDate(yr,mo,dy):
@@ -572,27 +572,40 @@
tz = self.localZone(ltm)
return tz
- def _parse(self, string):
+ def _parse(self, string, local=1):
# Parse date-time components from a string
- month=year=tz=tm=None
- spaces =self.space_chars
- intpat =self.int_pattern
- fltpat =self.flt_pattern
- wordpat =self.name_pattern
- delimiters =self.delimiters
- MonthNumbers =self._monthmap
- DayOfWeekNames=self._daymap
- ValidZones =self._tzinfo._zidx
- TimeModifiers =['am','pm']
+ month = year = tz = tm = None
+ spaces = self.space_chars
+ intpat = self.int_pattern
+ fltpat = self.flt_pattern
+ wordpat = self.name_pattern
+ delimiters = self.delimiters
+ MonthNumbers = self._monthmap
+ DayOfWeekNames = self._daymap
+ ValidZones = self._tzinfo._zidx
+ TimeModifiers = ['am','pm']
+
+ string = string.strip()
# Find timezone first, since it should always be the last
# element, and may contain a slash, confusing the parser.
- string = string.strip()
- sp=string.split()
- tz=sp[-1]
- if tz and (tz.lower() in ValidZones): string=' '.join(sp[:-1])
- else: tz = None # Decide later, since the default time zone
- # could depend on the date.
+
+
+ # First check for time zone of form +dd:dd
+ tz = _iso_tz_re.search(string)
+ if tz:
+ tz = tz.start(0)
+ tz, string = string[tz:], string[:tz].strip()
+ tz = tz[:3]+tz[4:]
+ else:
+ # Look at last token
+ sp=string.split()
+ tz = sp[-1]
+ if tz and (tz.lower() in ValidZones):
+ string=' '.join(sp[:-1])
+ else:
+ tz = None # Decide later, since the default time zone
+ # could depend on the date.
ints,dels=[],[]
i,l=0,len(string)
@@ -744,7 +757,8 @@
tod_int = int(math.floor(tod))
ms = tod - tod_int
hr,mn,sc = _calcHMS(tod_int, ms)
- if not tz:
+
+ if local and not tz:
# Figure out what time zone it is in the local area
# on the given date.
x = _calcDependentSecond2(year,month,day,hr,mn,sc)
@@ -806,3 +820,31 @@
parser = DateTimeParser()
parse = parser.parse
time = parser.time
+
+class tzinfo(object):
+
+ __slots__ = ('offset', )
+
+ def __init__(self, offset):
+ self.offset = offset
+
+ def utcoffset(self, dt=None):
+ return self.offset
+
+ __getstate__ = utcoffset
+ __setstate__ = __init__
+
+ def dst(self, dt): return 0
+ def tzname(self, dt): return ''
+
+from datetime import datetimetz as _datetimetz
+def parseDatetimetz(string):
+ y, mo, d, h, m, s, tz = parse(string)
+ s, micro = divmod(s, 1.0)
+ micro = int(micro * 1000000)
+ offset = _tzoffset(tz, None) / 60
+ return _datetimetz(y, mo, d, h, m, s, micro, tzinfo(offset))
+
+_iso_tz_re = re.compile("[-+]\d\d:\d\d$")
+
+