Skip to content

Instantly share code, notes, and snippets.

@davidmankin
Created December 16, 2022 19:25
Show Gist options
  • Save davidmankin/872388157e562dda8b90f631cc33657d to your computer and use it in GitHub Desktop.
Save davidmankin/872388157e562dda8b90f631cc33657d to your computer and use it in GitHub Desktop.
Format a python timedelta (`time_delta`) as a compact string. Works for past and future.
# Inspired by this stack overflow answer https://stackoverflow.com/a/17195550 by Bill Kidd
past = time_delta < datetime.timedelta(0)
if past:
hours, remainder = divmod(-1 * time_delta.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
else:
hours, remainder = divmod(time_delta.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
# Now format it compactly
hrs = f"{int(hours)}h " if hours else ""
min = f"{int(minutes)}m " if (not hours and minutes) or (hours == 1 and minutes != 0) else ""
sec = f"{int(seconds)}s " if not (hours or minutes) else ""
ago = "ago" if past else ""
in_s = "in " if not past else ""
print(f"{in_s}{hrs}{min}{sec}{ago}".strip())
@davidmankin
Copy link
Author

Some example results from my calendar…

{"starts": "19h ago", "ends": "18h ago"}
{"starts": "18h ago", "ends": "17h ago"}
{"starts": "18h ago", "ends": "17h ago"}
{"starts": "16h ago", "ends": "15h ago"}
{"starts": "15h ago", "ends": "15h ago"}
{"starts": "5h ago", "ends": "4h ago"}
{"starts": "4h ago", "ends": "in 7h"}
{"starts": "3h ago", "ends": "3h ago"}
{"starts": "2h ago", "ends": "in 6h"}
{"starts": "2h ago", "ends": "26m ago"}
{"starts": "in 33m", "ends": "in 1h 33m"}
{"starts": "in 2h", "ends": "in 4h"}
{"starts": "in 5h", "ends": "in 7h"}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment