User-friendly time format in Python?

后端 未结 14 1458
[愿得一人]
[愿得一人] 2020-12-12 10:06

Python: I need to show file modification times in the \"1 day ago\", \"two hours ago\", format.

Is there something ready to do that? It should be in English.

相关标签:
14条回答
  • 2020-12-12 11:03

    I've been dragging and tweaking this code from programming language to programming language for so long, I don't remember where I originally got it from. It served me well in PHP, Java, and TypeScript, and now it's time for Python.

    It handles past and future dates, as well as edge cases.

    def unix_time() -> int:
        return int(time.time())
    
    
    def pretty_time(t: int, absolute=False) -> str:
        if not type(t) is int:
            return "N/A"
        if t == 0:
            return "Never"
    
        now = unix_time()
        if t == now:
            return "Now"
    
        periods = ["second", "minute", "hour", "day", "week", "month", "year", "decade"]
        lengths = [60, 60, 24, 7, 4.35, 12, 10]
    
        diff = now - t
    
        if absolute:
            suffix = ""
        else:
            if diff >= 0:
                suffix = "ago"
            else:
                diff *= -1
                suffix = "remaining"
    
        i = 0
        while diff >= lengths[i] and i < len(lengths) - 1:
            diff /= lengths[i]
            i += 1
    
        diff = round(diff)
        if diff > 1:
            periods[i] += "s"
    
        return "{0} {1} {2}".format(diff, periods[i], suffix)
    
    0 讨论(0)
  • 2020-12-12 11:04

    The code was originally published on a blog post "Python Pretty Date function" (http://evaisse.com/post/93417709/python-pretty-date-function)

    It is reproduced here as the blog account has been suspended and the page is no longer available.

    def pretty_date(time=False):
        """
        Get a datetime object or a int() Epoch timestamp and return a
        pretty string like 'an hour ago', 'Yesterday', '3 months ago',
        'just now', etc
        """
        from datetime import datetime
        now = datetime.now()
        if type(time) is int:
            diff = now - datetime.fromtimestamp(time)
        elif isinstance(time,datetime):
            diff = now - time
        elif not time:
            diff = now - now
        second_diff = diff.seconds
        day_diff = diff.days
    
        if day_diff < 0:
            return ''
    
        if day_diff == 0:
            if second_diff < 10:
                return "just now"
            if second_diff < 60:
                return str(second_diff) + " seconds ago"
            if second_diff < 120:
                return "a minute ago"
            if second_diff < 3600:
                return str(second_diff / 60) + " minutes ago"
            if second_diff < 7200:
                return "an hour ago"
            if second_diff < 86400:
                return str(second_diff / 3600) + " hours ago"
        if day_diff == 1:
            return "Yesterday"
        if day_diff < 7:
            return str(day_diff) + " days ago"
        if day_diff < 31:
            return str(day_diff / 7) + " weeks ago"
        if day_diff < 365:
            return str(day_diff / 30) + " months ago"
        return str(day_diff / 365) + " years ago"
    
    0 讨论(0)
提交回复
热议问题