zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/lincappu/p/13184112.html
Copyright © 2011-2022 走看看