User-friendly time format in Python?

后端 未结 14 1457
[愿得一人]
[愿得一人] 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 10:40

    There is humanize package:

    >>> from datetime import datetime, timedelta
    >>> import humanize # $ pip install humanize
    >>> humanize.naturaltime(datetime.now() - timedelta(days=1))
    'a day ago'
    >>> humanize.naturaltime(datetime.now() - timedelta(hours=2))
    '2 hours ago'
    

    It supports localization l10n, internationalization i18n:

    >>> _ = humanize.i18n.activate('ru_RU')
    >>> print humanize.naturaltime(datetime.now() - timedelta(days=1))
    день назад
    >>> print humanize.naturaltime(datetime.now() - timedelta(hours=2))
    2 часа назад
    
    0 讨论(0)
  • 2020-12-12 10:41

    Using datetime objects with tzinfo:

    def time_elapsed(etime):
        # need to add tzinfo to datetime.utcnow
        now = datetime.utcnow().replace(tzinfo=etime.tzinfo)
        opened_for = (now - etime).total_seconds()
        names = ["seconds","minutes","hours","days","weeks","months"]
        modulos = [ 1,60,3600,3600*24,3600*24*7,3660*24*30]
        values = []
        for m in modulos[::-1]:
            values.append(int(opened_for / m))
            opened_for -= values[-1]*m
        pretty = [] 
        for i,nm in enumerate(names[::-1]):
            if values[i]!=0:
                pretty.append("%i %s" % (values[i],nm))
        return " ".join(pretty)
    
    0 讨论(0)
  • 2020-12-12 10:43

    The ago package provides this. Call human on a datetime object to get a human readable description of the difference.

    from ago import human
    from datetime import datetime
    from datetime import timedelta
    
    ts = datetime.now() - timedelta(days=1, hours=5)
    
    print(human(ts))
    # 1 day, 5 hours ago
    
    print(human(ts, precision=1))
    # 1 day ago
    
    0 讨论(0)
  • 2020-12-12 10:45

    You can also do that with arrow package

    From github page:

    >>> import arrow
    >>> utc = arrow.utcnow()
    >>> utc = utc.shift(hours=-1)
    >>> utc.humanize()
    'an hour ago'
    
    0 讨论(0)
  • 2020-12-12 10:48

    You can download and install from below link. It should be more helpful for you. It has been providing user friendly message from second to year.

    It's well tested.

    https://github.com/nareshchaudhary37/timestamp_content

    Below steps to install into your virtual env.

    git clone https://github.com/nareshchaudhary37/timestamp_content
    cd timestamp-content
    python setup.py
    
    0 讨论(0)
  • 2020-12-12 10:48

    Here is an updated answer based on Jed Smith's implementation that properly hands both offset-naive and offset-aware datetimes. You can also give a default timezones. Python 3.5+.

    import datetime
    
    def pretty_date(time=None, default_timezone=datetime.timezone.utc):
        """
        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
        """
    
        # Assumes all timezone naive dates are UTC
        if time.tzinfo is None or time.tzinfo.utcoffset(time) is None:
            if default_timezone:
                time = time.replace(tzinfo=default_timezone)
    
        now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
    
        if type(time) is int:
            diff = now - datetime.fromtimestamp(time)
        elif isinstance(time, datetime.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)
提交回复
热议问题