~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/date.py

  • Committer: William Grant
  • Date: 2012-06-28 01:52:02 UTC
  • Revision ID: me@williamgrant.id.au-20120628015202-f6ru7o367gt6nvgz
Hah

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
import datetime
22
22
 
23
23
def get_datetime(datetime_or_seconds):
24
 
    '''Return the given datetime, or convert the given seconds since epoch.'''
 
24
    '''Return the given datetime, or convert the given seconds since epoch.
 
25
 
 
26
    >>> get_datetime(1000000000)
 
27
    datetime.datetime(2001, 9, 9, 11, 46, 40)
 
28
    >>> get_datetime(2000000000)
 
29
    datetime.datetime(2033, 5, 18, 13, 33, 20)
 
30
 
 
31
    >>> get_datetime(datetime.datetime(2009, 5, 26, 11, 38, 53))
 
32
    datetime.datetime(2009, 5, 26, 11, 38, 53)
 
33
    >>> get_datetime(datetime.datetime(2001, 9, 9, 11, 46, 40))
 
34
    datetime.datetime(2001, 9, 9, 11, 46, 40)
 
35
    '''
25
36
    if type(datetime_or_seconds) is datetime.datetime:
26
37
        return datetime_or_seconds
27
38
    return datetime.datetime.fromtimestamp(datetime_or_seconds)
32
43
    Given a datetime or number of seconds elapsed since the epoch,
33
44
    generates a string representing the date/time in human-readable form.
34
45
    "ddd mmm dd, yyyy h:m a"
 
46
 
 
47
    >>> make_date_nice(datetime.datetime(2009, 5, 26, 11, 38, 53))
 
48
    'Tue May 26 2009, 11:38am'
35
49
    """
36
50
    dt = get_datetime(datetime_or_seconds)
37
 
    return dt.strftime("%a %b %d %Y, %I:%M %p")
 
51
    return dt.strftime("%a %b %d %Y, %l:%M%P")
38
52
 
39
53
def make_date_nice_short(datetime_or_seconds):
40
54
    """Generate a very compact human-readable representation of a date.
42
56
    Given a datetime or number of seconds elapsed since the epoch,
43
57
    generates a string representing the date in human-readable form.
44
58
    Does not include the time.
 
59
 
 
60
    >>> now = datetime.datetime.now()
 
61
    >>> make_date_nice_short(now)
 
62
    'Today'
 
63
    >>> make_date_nice_short(now - datetime.timedelta(1))
 
64
    'Yesterday'
 
65
    >>> make_date_nice_short(now - datetime.timedelta(2))
 
66
    '2 days ago'
 
67
    >>> make_date_nice_short(now - datetime.timedelta(5))
 
68
    '5 days ago'
 
69
    >>> make_date_nice_short(1242783748)
 
70
    'May 20, 2009'
45
71
    """
46
72
 
47
73
    dt = get_datetime(datetime_or_seconds)
77
103
 
78
104
    Also unlike make_date_nice_short, it is suitable for use in the middle of
79
105
    a block of prose and properly handles timestamps in the future nicely.
 
106
 
 
107
    >>> now = datetime.datetime.now()
 
108
    >>> today = now.date()
 
109
    >>> time = datetime.time(10, 35, 40)
 
110
    >>> earlier = datetime.datetime.combine(today, time)
 
111
    >>> date = datetime.datetime(2009, 5, 20, 21, 19, 53)
 
112
 
 
113
    >>> format_datetime_for_paragraph(now)
 
114
    'now'
 
115
 
 
116
    # We can go backwards and forwards a little while and be pretty.
 
117
    >>> format_datetime_for_paragraph(now - datetime.timedelta(0, 40))
 
118
    '40 seconds ago'
 
119
    >>> format_datetime_for_paragraph(now + datetime.timedelta(0, 30))
 
120
    'in 29 seconds'
 
121
 
 
122
    >>> format_datetime_for_paragraph(now - datetime.timedelta(0, 245))
 
123
    '4 minutes ago'
 
124
    >>> format_datetime_for_paragraph(now + datetime.timedelta(0, 3500))
 
125
    'in 58 minutes'
 
126
 
 
127
    # If we go back further, it gets a bit ugly.
 
128
    >>> format_datetime_for_paragraph(earlier - datetime.timedelta(1))
 
129
    'yesterday at 10:35am'
 
130
    >>> format_datetime_for_paragraph(date)
 
131
    'on 2009-05-20 at  9:19pm'
 
132
 
 
133
    >>> format_datetime_for_paragraph(earlier + datetime.timedelta(1))
 
134
    'tomorrow at 10:35am'
80
135
    """
81
136
 
82
137
    dt = get_datetime(datetime_or_seconds)
112
167
    if dt < now:
113
168
        if dt.date() == now.date():
114
169
            # Today.
115
 
            return dt.strftime('today at %I:%M %p')
 
170
            return dt.strftime('today at %l:%M%P')
116
171
        elif dt.date() == now.date() - datetime.timedelta(days=1):
117
172
            # Yesterday.
118
 
            return dt.strftime('yesterday at %I:%M %p')
 
173
            return dt.strftime('yesterday at %l:%M%P')
119
174
    elif dt > now:
120
175
        if dt.date() == now.date():
121
176
            # Today.
122
 
            return dt.strftime('today at %I:%M %p')
 
177
            return dt.strftime('today at %l:%M%P')
123
178
        elif dt.date() == now.date() + datetime.timedelta(days=1):
124
179
            # Tomorrow
125
 
            return dt.strftime('tomorrow at %I:%M %p')
 
180
            return dt.strftime('tomorrow at %l:%M%P')
126
181
 
127
 
    return dt.strftime('on %Y-%m-%d at %I:%M %p')
 
182
    return dt.strftime('on %Y-%m-%d at %l:%M%P')