]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/util/time_format.py
wui: improved columns in welcome page server list
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / util / time_format.py
1 # ISO-8601:
2 # http://www.cl.cam.ac.uk/~mgk25/iso-time.html
3
4 import calendar, datetime, re, time
5
6 def iso_utc_date(now=None, t=time.time):
7     if now is None:
8         now = t()
9     return datetime.datetime.utcfromtimestamp(now).isoformat()[:10]
10
11 def iso_utc(now=None, sep='_', t=time.time):
12     if now is None:
13         now = t()
14     return datetime.datetime.utcfromtimestamp(now).isoformat(sep)
15
16 def iso_local(now=None, sep='_', t=time.time):
17     if now is None:
18         now = t()
19     return datetime.datetime.fromtimestamp(now).isoformat(sep)
20
21 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+)?")):
22     """
23     The inverse of iso_utc().
24
25     Real ISO-8601 is "2003-01-08T06:30:59".  We also accept the widely
26     used variants "2003-01-08_06:30:59" and "2003-01-08 06:30:59".
27     """
28     m = _conversion_re.match(isotime)
29     if not m:
30         raise ValueError, (isotime, "not a complete ISO8601 timestamp")
31     year, month, day = int(m.group('year')), int(m.group('month')), int(m.group('day'))
32     hour, minute, second = int(m.group('hour')), int(m.group('minute')), int(m.group('second'))
33     subsecstr = m.group('subsecond')
34     if subsecstr:
35         subsecfloat = float(subsecstr)
36     else:
37         subsecfloat = 0
38
39     return calendar.timegm( (year, month, day, hour, minute, second, 0, 1, 0) ) + subsecfloat
40
41 def parse_duration(s):
42     orig = s
43     unit = None
44     DAY = 24*60*60
45     MONTH = 31*DAY
46     YEAR = 365*DAY
47     if s.endswith("s"):
48         s = s[:-1]
49     if s.endswith("day"):
50         unit = DAY
51         s = s[:-len("day")]
52     elif s.endswith("month"):
53         unit = MONTH
54         s = s[:-len("month")]
55     elif s.endswith("mo"):
56         unit = MONTH
57         s = s[:-len("mo")]
58     elif s.endswith("year"):
59         unit = YEAR
60         s = s[:-len("YEAR")]
61     else:
62         raise ValueError("no unit (like day, month, or year) in '%s'" % orig)
63     s = s.strip()
64     return int(s) * unit
65
66 def parse_date(s):
67     # return seconds-since-epoch for the UTC midnight that starts the given
68     # day
69     return int(iso_utc_time_to_seconds(s + "T00:00:00"))
70
71 def format_delta(time_1, time_2):
72     TIME_FORMAT = "%H:%M:%S %d-%b-%Y"
73     if time_1 is None:
74         absolute_str, relative_str = "N/A", "N/A"
75     else:
76         delta = int( time_2 - time_1 )
77         seconds = delta % 60
78         delta  -= seconds
79         minutes = (delta / 60) % 60
80         delta  -= minutes * 60
81         hours   = delta / (60*60) % 24
82         delta  -=  hours * 24
83         days    = delta / (24*60*60)
84         if not days:
85             if not hours:
86                 if not minutes:
87                     relative_str = "%ss" % (seconds)
88                 else:
89                     relative_str = "%sm%ss" % (minutes, seconds)
90             else:
91                 relative_str = "%sh%sm%ss" % (hours, minutes, seconds)
92         else:
93             relative_str = "%sd%sh%sm%ss" % (days, hours, minutes, seconds)
94         absolute_str = time.strftime(TIME_FORMAT, time.localtime(time_1))
95     return absolute_str, relative_str