• Python中时间的处理之——timedelta篇


     
    #! /usr/bin/python
    # coding=utf-8
    
    from datetime import datetime,timedelta
    
    """
    timedelta代表两个datetime之间的时间差
    """
    now = datetime.now()
    past = past = datetime(2010,11,12,13,14,15,16)
    
    timespan = now - past
    #这会得到一个负数
    past - now
    attrs = [
    ("days","日"),( 'seconds',"秒"),( 'microseconds',"毫秒")
    #('min',"最小"),( 'max',"最大"),
    ]
    for k,v in attrs:
        "timespan.%s = %s #%s" % (k,getattr(timespan, k),v)
    
    """
    总共相差的秒数
    """
    timespan.total_seconds()
    
    """
    实例化一个timespan
    请注意它的参数顺序
    timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
    """
    timespan = timedelta(days=1)
    now - timespan #返回的是datetime型
    now + timespan
    
    timespan * 2 #还可以乘哦。代表二倍
    timespan / 13
    
    #增加一个月
    from calendar import monthrange
    now + timedelta(days=monthrange(start.year,start.month)[1])
     
    复制代码
    实例1:
    '''时间d距离now()的长度,比如:1分钟前,1小时前,1月前,1年前'''
     
    Python代码  收藏代码
    1. # -*- encoding=UTF-8 -*-  
    2. import datetime  
    3. def timebefore(d):  
    4.      chunks = (  
    5.                        (60 * 60 * 24 * 365, u'年'),  
    6.                        (60 * 60 * 24 * 30, u'月'),  
    7.                        (60 * 60 * 24 * 7, u'周'),  
    8.                        (60 * 60 * 24, u'天'),  
    9.                        (60 * 60, u'小时'),  
    10.                        (60, u'分钟'),  
    11.      )  
    12.      #如果不是datetime类型转换后与datetime比较  
    13.     if not isinstance(d, datetime.datetime):  
    14.            d = datetime.datetime(d.year,d.month,d.day)  
    15.     now = datetime.datetime.now()  
    16.     delta = now - d  
    17.     #忽略毫秒  
    18.     before = delta.days * 24 * 60 * 60 + delta.seconds  #python2.7直接调用 delta.total_seconds()  
    19.     #刚刚过去的1分钟  
    20.     if before <= 60:  
    21.            return u'刚刚'  
    22.     for seconds,unit in chunks:  
    23.            count = before // seconds  
    24.            if count != 0:  
    25.                  break  
    26.     return unicode(count)+unit+u"前"  

     实例2:

    ‘’‘当前的时间上加一天或一年减一天等操作’‘’

    Python代码1  收藏代码
    1. #!/usr/bin/env python  
    2. # -*- coding:utf-8 -*-  
    3.   
    4. from datetime import datetime,timedelta  
    5.   
    6. now = datetime.now()  
    7.   
    8. yestoday = now - timedelta(days=1)  
    9. tommorow = now + timedelta(days=1)  
    10.   
    11. next_year = now + timedelta(days = 365)  
    Python代码2  收藏代码
    1. #使用replace()代替日期加减
    2. from datetime import datetime
    3. now1 = datetime.now()
    4.   now1     # datetime.datetime(2017, 2, 10, 22, 29, 48, 288500)
    5. # 增加一天或减少一天 
    6.  now2 = now1.replace(day=9)
    7. now2  # datetime.datetime(2017, 2, 9, 22, 29, 48, 288500)
    8. # timestrap() 函数是把日期转化为时间戳,时间戳就是秒数
    9. time_span = now1.timestrap() - now2.timestrap()/(24*3600) 
    10. time_span # 1     

    日期常用问题

    1: Datetime中offset-naive与offset-aware时间的计算

    在使用Django时,默认是开启对多时区的支持的,在获取时间的时候会是如下形式:

    datetime.datetime(2014, 4, 18, 15, 37, 7, tzinfo=<UTC>)

    我们可以利用django.utils.timezone中提供的localtime方法来将该时间转换为本地时间:

    1
    2
    3
    4
    >>> dt
    datetime.datetime(201441815377, tzinfo=<UTC>)
    >>> localtime(dt)
    datetime.datetime(201441823377, tzinfo=<LocalTimezone>)

    有时候,我们需要将该时间与当前时间做比较,例如计算差值,你可能会想到直接这么做:

    1
    2
    3
    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> now - dt

    不过这是不对的,并告知如下错误:

    1
    2
    3
    Traceback (most recent call last):
      File "<console>", line 1in <module>
    TypeError: can't subtract offset-naive and offset-aware datetimes

    问题就出在利用datetime.datetime.now()得到的当前时间是offset-naive的,而另外一个却是offset-aware的,因此我们需要将这里的dt转成与now一样的形式,可以这么做:

    1
    2
    3
    4
    5
    >>> dt = dt.replace(tzinfo=None)
    >>> dt
    datetime.datetime(201441815377)
    >>> now - dt
    datetime.timedelta(034108443000)

    备注:1:timezone 获取的日期增加和修改(比如加一天减一天)

    from django.utiles import timezone

    from datetime

    t1 = timezone.now()

    # torrow

    t1+datetime.timedelta(days=1,hours=1)

     2:python得到两个时间段的每一天的列表

    复制代码
    date_list = []
        begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
        end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
        while begin_date <= end_date:
            date_str = begin_date.strftime("%m-%d")
            date_list.append(date_str)
            begin_date += datetime.timedelta(days=1)
        print date_list

    # 方法2(安装boto3 库 pip install boto3):
    from datetime import datetime
    from dateutil.rrule import rrule, DAILY

    a = datetime(2009, 5, 30)
    b = datetime(2009, 6, 9)

    for dt in rrule(DAILY, dtstart=a, until=b):
        print dt.strftime("%Y-%m-%d")

    # 在原来日期上增加一年

    from dateutil.relativedelta import relativedelta
    from django.utils import timezone
    t1 = timezone.now()
    neww_year = t1 + relativedelta(years=1)
  • 相关阅读:
    QT添加托盘代码
    2010年左右我说要做一个操作系统的时候,绝大多数人以为那是天方夜谭,是堂吉诃德式的行为。今天,我们讨论YunOS会成为一个新的生态和创新平台,更多人相信这件事是可能的。
    台哥算法练习:八皇后问题
    台哥算法练习 汉诺塔问题
    台哥算法练习:数组排序的几种算法
    面试遇到的两道算法题
    台哥算法练习 50人围圈报数
    台哥算法练习 自己写的一个LinkedList
    台哥算法练习 自己写的一个ArrayList
    台哥算法练习 寻找和为某值的子集
  • 原文地址:https://www.cnblogs.com/lincappu/p/13184112.html
Copyright © 2020-2023  润新知