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

fromdjangoimporttemplatefrombisectimportbisectregister=template.Library()@register.filterdeffuzzy_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:returnperiods[bisect(breakpoints,time.hour)]exceptAttributeError:# Not a datetime objectreturn''#Fail silently