Login

Fuzzy Time of Day

Author:
waylan
Posted:
June 13, 2007
Language:
Python
Version:
.96
Tags:
template filter time
Score:
3 (after 3 ratings)

This filter will display the time as word(s) indicating roughly the time of day ("Morning", "Afternoon", "Evening", etc). For example, the following template snippet:

Posted in the {{ post.date|fuzzy_time }} of {{ post.date|date:"F j, Y"} }}.

will result in the following (assuming post.date == datetime.datetime(2007, 6, 13, 20, 57, 55, 765000)):

Posted in the evening of June 13, 2007.

The terms used and breakpoints (hours only) can be rather arbitrary so you may want to adjust them to your liking. See the docs for bisect for help in understanding the code. Just remember you should have one less breakpoint than periods and the first breakpoint falls at the end of the first period. The idea was inspired by Dunstan Orchard, although the code is very different (php case statement). He uses quite a bit more periods in a day, so you might want to take a look.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from django import template
from bisect import bisect

register = template.Library()

@register.filter
def fuzzy_time(time):
    """
    Formats a time as fuzzy periods of the day.
    Accepts a datetime.time or datetime.datetime object.
    """
    periods = ["Early-Morning", "Morning", "Mid-day", \
               "Afternoon", "Evening", "Late-Night"]
    breakpoints = [4, 10, 13, 17, 21]
    try:
        return periods[bisect(breakpoints, time.hour)]
    except AttributeError: # Not a datetime object
        return '' #Fail silently

More like this

  1. Effective content caching for mass-load site using redirect feature by nnseva 4 years ago
  2. FieldsetForm by Ciantic 8 years, 3 months ago
  3. Querying datetime aware objects in your local timezone by jayliew 3 years, 2 months ago
  4. plaintext filter by onelson 5 years, 3 months ago
  5. UPDATED: Django Image Thumbnail Filter by danfairs 7 years, 9 months ago

Comments

b23 (on June 9, 2008):

hi waylan,

nice snippet. In your description there is a little typo:

Posted in the {{ post.date|fuzzy_time }} of {{ post.date|date:"F j, Y"} }}

a closing bracket too much :)

#

Please login first before commenting.