How to calculate relative past time from a given date & time (e.g., 3 hours ago, 5 days ago, a month ago) in Python

1 Answer

0 votes
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

'''

 



answered Apr 13 by avibootz

Related questions

...