summaryrefslogtreecommitdiff
path: root/paste/wareweb/timeinterval.py
blob: f2d14b8aa12f0bb5f24aad05b440f4a097af2c8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""
timeinterval

Convert interval strings (in the form of 1w2d, etc) to
seconds, and back again.  Is not exactly about months or
years (leap years in particular).

Accepts (y)ear, (b)month, (w)eek, (d)ay, (h)our, (m)inute, (s)econd.

Exports only time_encode and time_decode functions.  
"""

import re

second = 1
minute = second*60
hour = minute*60
day = hour*24
week = day*7
month = day*30
year = day*365
time_values = {
    'y': year,
    'b': month,
    'w': week,
    'd': day,
    'h': hour,
    'm': minute,
    's': second,
    }
time_ordered = time_values.items()
time_ordered.sort(lambda a, b: -cmp(a[1], b[1]))
    
def time_encode(seconds):
    """Encodes a number of seconds (representing a time interval)
    into a form like 1h2d3s."""
    s = ''
    for char, amount in time_ordered:
        if seconds >= amount:
            i, seconds = divmod(seconds, amount)
            s += '%i%s' % (i, char)
    return s

time_re = re.compile(r'[0-9]+[a-zA-Z]')
def time_decode(s):
    """Decodes a number in the format 1h4d3m (1 hour, 3 days, 3 minutes)
    into a number of seconds"""
    time = 0
    for match in all_matches(s, time_re):
        char = match.group(0)[-1].lower()
        if not time_values.has_key(char):
            # @@: should signal error
            continue
        time += int(match.group(0)[:-1]) * time_values[char]
    return time

def all_matches(source, regex):
    """
    Return a list of matches for regex in source
    """
    pos = 0
    end = len(source)
    rv = []
    match = regex.search(source, pos)
    while match:
        rv.append(match)
        match = regex.search(source, match.end() )
    return rv

__all__ = ['time_encode', 'time_decode']