1 # Copyright (c) 2001 Autonomous Zone Industries
2 # Copyright (c) 2002-2007 Bryce "Zooko" Wilcox-O'Hearn
3 # This file is licensed under the
4 # GNU Lesser General Public License v2.1.
5 # See the file COPYING or visit http://www.gnu.org/ for details.
8 # http://www.cl.cam.ac.uk/~mgk25/iso-time.html
10 import datetime, re, time
12 def iso_utc_date(now=None, t=time.time):
15 return datetime.datetime.utcfromtimestamp(now).isoformat()[:10]
17 def iso_utc(now=None, sep='_', t=time.time):
20 return datetime.datetime.utcfromtimestamp(now).isoformat(sep)
22 def iso_local(now=None, sep='_', t=time.time):
25 return datetime.datetime.fromtimestamp(now).isoformat(sep)
27 def iso_utc_time_to_seconds(isotime, _conversion_re=re.compile(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})[T_ ](?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})(?P<subsecond>\.\d+)?")):
29 The inverse of iso_utc().
31 Real ISO-8601 is "2003-01-08T06:30:59". We also accept the widely
32 used variants "2003-01-08_06:30:59" and "2003-01-08 06:30:59".
34 m = _conversion_re.match(isotime)
36 raise ValueError, (isotime, "not a complete ISO8601 timestamp")
37 year, month, day = int(m.group('year')), int(m.group('month')), int(m.group('day'))
38 hour, minute, second = int(m.group('hour')), int(m.group('minute')), int(m.group('second'))
39 subsecstr = m.group('subsecond')
41 subsecfloat = float(subsecstr)
45 localsecondsnodst = time.mktime( (year, month, day, hour, minute, second, 0, 1, 0) )
46 localsecondsnodst += subsecfloat
47 utcseconds = localsecondsnodst - time.timezone
50 def parse_duration(s):
61 elif s.endswith("month"):
64 elif s.endswith("mo"):
67 elif s.endswith("year"):
71 raise ValueError("no unit (like day, month, or year) in '%s'" % orig)
76 # return seconds-since-epoch for the UTC midnight that starts the given
78 return int(iso_utc_time_to_seconds(s + "T00:00:00"))