Skip to content

Instantly share code, notes, and snippets.

@pistatium
Created April 15, 2016 03:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pistatium/23dd753500b975a5b8a87ddd4641cca2 to your computer and use it in GitHub Desktop.
Save pistatium/23dd753500b975a5b8a87ddd4641cca2 to your computer and use it in GitHub Desktop.
timeago
from datetime import timedelta, datetime
from django.utils import timezone
from django.test import TestCase
from django import template
register = template.Library()
@register.filter()
def timeago(dt: datetime, now_dt: datetime=None) -> str:
if not now_dt:
now_dt = timezone.now()
diff = now_dt - dt
diff_days = diff.days
if diff > timedelta(days=365):
return "{}年".format(diff_days//365)
if diff > timedelta(days=31):
return "{}ヶ月".format(diff_days//31)
if diff > timedelta(days=7):
return "{}週間".format(diff_days//7)
diff_hours = int(diff.total_seconds()) // 60 // 60
if diff > timedelta(hours=72):
return "{}日".format(diff_days)
if diff > timedelta(hours=1):
return "{}時間".format(diff_hours)
diff_minutes = int(diff.total_seconds()) // 60
return "{}分".format(diff_minutes)
class TestTemplatetags(TestCase):
def test_timeago_year(self):
now = timezone.now()
target = timezone.now() - timedelta(days=366)
self.assertEqual(timeago(target, now), '1年')
target = timezone.now() - timedelta(days=800)
self.assertEqual(timeago(target, now), '2年')
def test_timeago_month(self):
now = timezone.now()
target = timezone.now() - timedelta(days=35)
self.assertEqual(timeago(target, now), '1ヶ月')
target = timezone.now() - timedelta(days=365)
self.assertEqual(timeago(target, now), '11ヶ月')
def test_timeago_week(self):
now = timezone.now()
target = timezone.now() - timedelta(days=8)
self.assertEqual(timeago(target, now), '1週間')
target = timezone.now() - timedelta(days=30)
self.assertEqual(timeago(target, now), '4週間')
def test_timeago_day(self):
now = timezone.now()
target = timezone.now() - timedelta(days=6, hours=23)
self.assertEqual(timeago(target, now), '6日')
target = timezone.now() - timedelta(days=3, hours=1)
self.assertEqual(timeago(target, now), '3日')
def test_timeago_hour(self):
now = timezone.now()
target = timezone.now() - timedelta(hours=1, minutes=1)
self.assertEqual(timeago(target, now), '1時間')
target = timezone.now() - timedelta(hours=71, minutes=1)
self.assertEqual(timeago(target, now), '71時間')
def test_timeago_minutes(self):
now = timezone.now()
target = timezone.now() - timedelta(seconds=1)
self.assertEqual(timeago(target, now), '0分')
target = timezone.now() - timedelta(minutes=1, seconds=1)
self.assertEqual(timeago(target, now), '1分')
target = timezone.now() - timedelta(minutes=59, seconds=59)
self.assertEqual(timeago(target, now), '59分')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment