from datetime import datetime, timedelta, timezone
def to_relative_past_time(past: datetime) -> str:
now = datetime.now(timezone.utc)
delta = abs((now - past).total_seconds())
seconds = int(delta)
minutes = seconds // 60
hours = seconds // 3600
days = seconds // 86400
if seconds < 60:
return "one second ago" if seconds == 1 else f"{seconds} seconds ago"
if seconds < 3600:
return "a minute ago" if minutes == 1 else f"{minutes} minutes ago"
if seconds < 86400:
return "an hour ago" if hours == 1 else f"{hours} hours ago"
if seconds < 2592000: # 30 days
return "yesterday" if days == 1 else f"{days} days ago"
if seconds < 31104000: # 12 months
months = days // 30
return "a month ago" if months <= 1 else f"{months} months ago"
years = days // 365
return "a year ago" if years <= 1 else f"{years} years ago"
def test(hours_ago: float):
past = datetime.now(timezone.utc) - timedelta(seconds=round(hours_ago * 3600))
print(to_relative_past_time(past))
if __name__ == "__main__":
test(0.01) # 36 seconds ago
test(0.2) # 12 minutes ago
test(3) # 3 hours ago
test(25) # yesterday
test(360) # 15 days ago
test(1239) # a month ago
test(2239) # 3 months ago
test(8760) # a year ago
test(98763) # 11 years ago
'''
run:
36 seconds ago
12 minutes ago
3 hours ago
yesterday
15 days ago
a month ago
3 months ago
a year ago
11 years ago
'''