2018-08-21 03:43:23 +02:00
|
|
|
from datetime import datetime, timedelta
|
2018-08-21 19:15:10 +02:00
|
|
|
from django.utils.timezone import get_default_timezone, get_current_timezone, localtime
|
|
|
|
from django.utils.timezone import now as django_now
|
2018-08-21 03:43:23 +02:00
|
|
|
from django import template
|
|
|
|
|
|
|
|
register = template.Library()
|
|
|
|
|
|
|
|
@register.filter(is_safe=True)
|
|
|
|
def humane_time(arg):
|
|
|
|
'''Returns a time string that is humane but not relative (unlike Django's humanetime)
|
|
|
|
|
|
|
|
For times less than 6 hours ago: display date and time to the minute.
|
|
|
|
For times less than 12 hours ago: display date and time to the hour.
|
|
|
|
For times more than 12 hours ago display date and "time of day".
|
|
|
|
For times more than 2 days ago display date.
|
|
|
|
For times more than 6 months ago, display month and year.
|
|
|
|
For times more than 10 years ago, display year.
|
|
|
|
|
|
|
|
Prefer words to numbers, unless it is too long.
|
|
|
|
|
|
|
|
The goal is a date/time that is always accurate no matter how long it's
|
|
|
|
been sitting there waiting for you to look at it, but is only precise
|
|
|
|
to a degree you are liable to care about.
|
|
|
|
|
|
|
|
It is not safe to use on future times.
|
|
|
|
|
|
|
|
'''
|
2018-08-21 19:15:10 +02:00
|
|
|
now = django_now()
|
|
|
|
arg = localtime(arg)
|
2018-08-21 03:43:23 +02:00
|
|
|
diff = now - arg
|
|
|
|
|
2018-08-21 19:15:10 +02:00
|
|
|
if arg.tzinfo == now.tzinfo:
|
|
|
|
utc = " (UTC)"
|
|
|
|
else:
|
|
|
|
utc = ""
|
2018-08-21 03:43:23 +02:00
|
|
|
if diff < timedelta(hours=6):
|
2018-08-21 19:15:10 +02:00
|
|
|
return arg.strftime("%a, %b %d, %Y at %I:%M %p") + utc
|
2018-08-21 03:43:23 +02:00
|
|
|
elif diff < timedelta(hours=12):
|
2018-08-21 19:15:10 +02:00
|
|
|
return arg.strftime("%a, %b %d, %Y around %I %p") + utc
|
|
|
|
elif diff < timedelta(hours=36):
|
|
|
|
return arg.strftime("%a, %b %d, %Y in the ") + time_of_day(arg.hour) + utc
|
2018-08-21 03:43:23 +02:00
|
|
|
elif diff < timedelta(days=6*28):
|
|
|
|
return arg.strftime("%b %d, %Y")
|
|
|
|
elif diff < timedelta(days=10*365):
|
|
|
|
return arg.strftime("%b, %Y")
|
|
|
|
else:
|
|
|
|
return arg.strftime("%Y")
|
|
|
|
|
|
|
|
def time_of_day(hour):
|
|
|
|
"""Return a description of what time of day an hour is.
|
|
|
|
|
|
|
|
This is very english-centric and probably not translatable.
|
|
|
|
"""
|
|
|
|
if hour < 3:
|
|
|
|
return "wee hours"
|
|
|
|
elif hour < 6:
|
|
|
|
return "early morning"
|
|
|
|
elif hour < 12:
|
|
|
|
return "morning"
|
|
|
|
elif hour < 18:
|
|
|
|
return "afternoon"
|
|
|
|
elif hour < 22:
|
|
|
|
return "evening"
|
|
|
|
else:
|
|
|
|
return "night"
|