【问题标题】:Python human readable date differencePython人类可读的日期差异
【发布时间】:2010-06-28 12:50:28
【问题描述】:

我给出了这样的日期字符串:

Mon Jun 28 10:51:07 2010
Fri Jun 18 10:18:43 2010
Wed Dec 15 09:18:43 2010

什么是计算天数差异的便捷 python 方法?假设时区相同。

字符串由 linux 命令返回。

编辑:谢谢你,这么多好答案

【问题讨论】:

标签: python datetime


【解决方案1】:
#!/usr/bin/env python

import datetime

def hrdd(d1, d2):
    """
    Human-readable date difference.
    """
    _d1 = datetime.datetime.strptime(d1, "%a %b %d %H:%M:%S %Y")
    _d2 = datetime.datetime.strptime(d2, "%a %b %d %H:%M:%S %Y")
    diff = _d2 - _d1
    return diff.days # <-- alternatively: diff.seconds 

if __name__ == '__main__':
    d1 = "Mon Jun 28 10:51:07 2010"
    d2 = "Fri Jun 18 10:18:43 2010"
    d3 = "Wed Dec 15 09:18:43 2010"

    print hrdd(d1, d2)
    # ==> -11
    print hrdd(d2, d1)
    # ==> 10
    print hrdd(d1, d3)
    # ==> 169
    # ...

【讨论】:

    【解决方案2】:
    >>> import datetime
    >>> a = datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y")
    >>> b = datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y")
    >>> c = a-b
    >>> c.days
    10
    

    【讨论】:

    • 这是其他答案中使用的sn-p
    • 是的,据我所知,我的答案早于其他人(或包含这些 sn-ps 的编辑)。并不是说这是一个非常有创意的答案,您只需要阅读文档...)
    【解决方案3】:

    使用strptime

    示例用法:

    from datetime import datetime
    
    my_date = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y')
    print my_date
    

    编辑:

    您还可以以人类可读的形式打印时差,如下所示:

    from time import strptime
    from datetime import datetime
    
    def date_diff(older, newer):
        """
        Returns a humanized string representing time difference
    
        The output rounds up to days, hours, minutes, or seconds.
        4 days 5 hours returns '4 days'
        0 days 4 hours 3 minutes returns '4 hours', etc...
        """
    
        timeDiff = newer - older
        days = timeDiff.days
        hours = timeDiff.seconds/3600
        minutes = timeDiff.seconds%3600/60
        seconds = timeDiff.seconds%3600%60
    
        str = ""
        tStr = ""
        if days > 0:
            if days == 1:   tStr = "day"
            else:           tStr = "days"
            str = str + "%s %s" %(days, tStr)
            return str
        elif hours > 0:
            if hours == 1:  tStr = "hour"
            else:           tStr = "hours"
            str = str + "%s %s" %(hours, tStr)
            return str
        elif minutes > 0:
            if minutes == 1:tStr = "min"
            else:           tStr = "mins"           
            str = str + "%s %s" %(minutes, tStr)
            return str
        elif seconds > 0:
            if seconds == 1:tStr = "sec"
            else:           tStr = "secs"
            str = str + "%s %s" %(seconds, tStr)
            return str
        else:
            return None
    
    older = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y')
    newer = datetime.strptime('Tue Jun 28 10:52:07 2010', '%a %b %d %H:%M:%S %Y')
    print date_diff(older, newer)
    

    Original sourcesn-p.

    【讨论】:

      【解决方案4】:

      这与其他答案的思路不同,但它可能对希望显示更易于阅读(且不太精确)的人有所帮助。我很快就完成了,欢迎提出建议。

      (请注意,它假定until_seconds 是较晚的时间戳。)

      def readable_delta(from_seconds, until_seconds=None):
          '''Returns a nice readable delta.
      
          readable_delta(1, 2)           # 1 second ago
          readable_delta(1000, 2000)     # 16 minutes ago
          readable_delta(1000, 9000)     # 2 hours, 133 minutes ago
          readable_delta(1000, 987650)   # 11 days ago
          readable_delta(1000)           # 15049 days ago (relative to now)
          '''
      
          if not until_seconds:
              until_seconds = time.time()
      
          seconds = until_seconds - from_seconds
          delta = datetime.timedelta(seconds=seconds)
      
          # deltas store time as seconds and days, we have to get hours and minutes ourselves
          delta_minutes = delta.seconds // 60
          delta_hours = delta_minutes // 60
      
          ## show a fuzzy but useful approximation of the time delta
          if delta.days:
              return '%d day%s ago' % (delta.days, plur(delta.days))
          elif delta_hours:
              return '%d hour%s, %d minute%s ago' % (delta_hours, plur(delta_hours), delta_minutes, plur(delta_minutes))
          elif delta_minutes:
              return '%d minute%s ago' % (delta_minutes, plur(delta_minutes))
          else:
              return '%d second%s ago' % (delta.seconds, plur(delta.seconds))
      
      def plur(it):
          '''Quick way to know when you should pluralize something.'''
          try:
              size = len(it)
          except TypeError:
              size = int(it)
          return '' if size==1 else 's'
      

      【讨论】:

        【解决方案5】:

        试试这个:

        >>> (datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y") - datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y")).days
        10
        

        【讨论】:

          【解决方案6】:
          from datetime import datetime
          
          resp = raw_input("What is the first date ?")
          date1 = datetime.strptime(resp,"%a %b %d %H:%M:%S %Y")
          resp2 = raw_input("What is the second date ?")
          date2 = datetime.strptime(resp2,"%a %b %d %H:%M:%S %Y")
          res = date2-date1
          print str(res)
          

          关于如何更好地打印timedelta对象的详细信息,可以查看this previous post

          【讨论】:

            【解决方案7】:

            这是@the_void 改进的 date_diff() 例程。它将根据差异的大小以以下方式打印差异:

            1d 
            12 sec
            30 min 12 sec
            3h 30m 
            5d 3h 30m 
            

            下面是例程:

            def date_diff(newer, older):
                if newer < older:
                    return '-1'
            
                timeDiff = newer - older
                days = int(timeDiff.days)
                hours = int(timeDiff.seconds/3600)
                minutes = int(timeDiff.seconds%3600/60)
                seconds = int(timeDiff.seconds%3600%60)
            
                str = ""
                tStr = ""
                if days > 0:
                    tStr = "d"
                    str = str + "%s%s " %(days, tStr)        
            
                if hours > 0:
                    tStr = "h"
                    str = str + "%s%s " %(hours, tStr)
                    
                if minutes > 0:
                    if days == 0 and hours == 0:
                        tStr = 'min'
                        str = str + "%s %s " %(minutes, tStr)
                    else:
                        tStr = "m"
                        str = str + "%s%s " %(minutes, tStr)
                    
                if days == 0 and hours == 0:    
                    if seconds >= 0:
                        if days == 0 and hours == 0:
                            tStr = "sec"               
                            
                            str = str + "%s %s" %(seconds, tStr)
                        else:
                            tStr = 's'
                            str = str + "%s%s" %(seconds, tStr)
                
                return str
            

            【讨论】:

              猜你喜欢
              • 2019-05-12
              • 1970-01-01
              • 2013-06-20
              • 2011-09-26
              • 2014-02-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-04
              相关资源
              最近更新 更多