]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/util/time_format.py
leases, time_format: modify time stamping in lease description
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / util / time_format.py
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.
6
7 # ISO-8601:
8 # http://www.cl.cam.ac.uk/~mgk25/iso-time.html
9
10 import datetime, re, time
11
12 def iso_utc_date(now=None, t=time.time):
13     if now is None:
14         now = t()
15     return datetime.datetime.utcfromtimestamp(now).isoformat()[:10]
16
17 def iso_utc(now=None, sep='_', t=time.time):
18     if now is None:
19         now = t()
20     return datetime.datetime.utcfromtimestamp(now).isoformat(sep)
21
22 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+)?")):
23     """
24     The inverse of iso_utc().
25
26     Real ISO-8601 is "2003-01-08T06:30:59".  We also accept the widely
27     used variants "2003-01-08_06:30:59" and "2003-01-08 06:30:59".
28     """
29     m = _conversion_re.match(isotime)
30     if not m:
31         raise ValueError, (isotime, "not a complete ISO8601 timestamp")
32     year, month, day = int(m.group('year')), int(m.group('month')), int(m.group('day'))
33     hour, minute, second = int(m.group('hour')), int(m.group('minute')), int(m.group('second'))
34     subsecstr = m.group('subsecond')
35     if subsecstr:
36         subsecfloat = float(subsecstr)
37     else:
38         subsecfloat = 0
39
40     localsecondsnodst = time.mktime( (year, month, day, hour, minute, second, 0, 1, 0) )
41     localsecondsnodst += subsecfloat
42     utcseconds = localsecondsnodst - time.timezone
43     return utcseconds
44
45 def parse_duration(s):
46     orig = s
47     unit = None
48     DAY = 24*60*60
49     MONTH = 31*DAY
50     YEAR = 365*DAY
51     if s.endswith("s"):
52         s = s[:-1]
53     if s.endswith("day"):
54         unit = DAY
55         s = s[:-len("day")]
56     elif s.endswith("month"):
57         unit = MONTH
58         s = s[:-len("month")]
59     elif s.endswith("mo"):
60         unit = MONTH
61         s = s[:-len("mo")]
62     elif s.endswith("year"):
63         unit = YEAR
64         s = s[:-len("YEAR")]
65     else:
66         raise ValueError("no unit (like day, month, or year) in '%s'" % orig)
67     s = s.strip()
68     return int(s) * unit
69
70 def parse_date(s):
71     # return seconds-since-epoch for the UTC midnight that starts the given
72     # day
73     return int(iso_utc_time_to_seconds(s + "T00:00:00"))
74