zoukankan      html  css  js  c++  java
  • time和datetime模块

    time和datetime和tzinfo

     

    time和datetime模块还有tzinfo (时区)(一直不明白两者的区别,然后摘了两片文章(最后面的两个链接),很清晰...)

    一、time模块

    常用函数

    1. time()函数

    time()函数返回的是时间戳(timestamp)。所谓时间戳指的是从1970年1月1日00:00:00开始按秒计算的偏移量。其他返回时间戳方式的函数还有clock()。

    实例

    >>>import time
    >>>time.time()
    1515117751.8810253

    2. ctime()函数

    ctime()函数可以将一个时间戳转化为字符串的形式,默认time.time()为参数。(convert time in seconds to string)

    实例

    >>>import time
    >>>time.ctime()
    'Fri Jan  5 10:21:29 2018'
    >>>time.ctime(1500000000)
    'Fri Jul 14 10:40:00 2017'

    4.gmtime()函数

    gmtime()用于获取UTC时间,UTC时间实际就是格林尼治时间,它与中国时间的时差为八个小时。

    实例

    >>>import time
    >>>time.gmtime()
    time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5, tm_hour=3, tm_min=27, tm_sec=18, tm_wday=4, tm_yday=5, tm_isdst=0)

    5. localtime()函数

    localtime()用于获取当前时区的当前时间。

    实例

    >>>import time
    >>>time.localtime()
    time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5,tm_hour=11, tm_min=28, tm_sec=48, tm_wday=4, tm_yday=5, tm_isdst=0)

    6. strftime()函数

    strftime()把一个代表时间的元组或者struct_time(如time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。

    实例

    >>> time.strftime("%Y-%m-%d %X")
    '2018-01-05 11:20:21'
    >>> time.strftime("%Y-%m-%d %H:%M:%S")
    '2018-01-05 11:21:30'
    >>> time.strftime("%Y-%m-%d %X", time.localtime())
    '2018-01-05 11:23:04'

    * format time格式化表示*

    格式含义
    %Y 完整的年份
    %m 月份(01 - 12)
    %d 一个月中的第几天(01 - 31)
    %H 一天中的第几个小时(24小时制,00 - 23)
    %M 分钟数(00 - 59)
    %S 秒(01 - 61)
    %X 本地相应时间
    %x 本地相应日期
    %a 本地(locale)简化星期名称
    %A 本地完整星期名称
    %b 本地简化月份名称
    %B 本地完整月份名称
    %c 本地相应的日期和时间表示
    %I 第几个小时(12小时制,01 - 12)
    %j 一年中的第几天(001 - 366)
    %p 本地am或者pm的相应符
    %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)
    %w 一个星期中的第几天(0 - 6,0是星期天)
    %W 和%U基本相同,不同的是%W以星期一为一个星期的开始
    %y 去掉世纪的年份(00 - 99)
    %Z 时区的名字(如果不存在为空字符)
    %% ‘%’字符

    注:表中加粗部分为最常用格式

    7. strptime()函数

    strptime()把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作

    实例

    >>>import time
    >>>time.strptime('2018-01-05 10:50:06','%Y-%m-%d %X')       
    time.struct_time(tm_year=2018,tm_mon=1,tm_mday=5,tm_hour=10,tm_min=50,tm_sec=6, tm_wday=4, tm_yday=5, tm_isdst=-1)

    8. mktime()函数

    mktime()可以将struct_time转换成用时间的浮点数表示

    实例

    >>> time.mktime(time.gmtime())
    1515094387.0
    >>> time.mktime(time.localtime())
    1515123246.0

    9. sleep()函数

    线程推迟指定的时间运行,单位为秒。

    import time
    >>> time.sleep(3) #表示延迟3秒后程序继续运行

    小结:

    time模块中时间表现的格式主要有3种: 
    1. timestamp 时间戳 
    2. tuple或者struct_time 时间元组,共有九个元素组 
    3. formattime格式化字符串

    它们之间的转化如图所示
    这里写图片描述

     

    二、datetime模块

    datetime模块包含一个datetime类,通过from datetime import datetime导入的就是datetime这个类。

    常见操作

    1. 获取当前日期

    >>> from datetime import datetime
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2018, 1, 5, 16, 2, 47, 929705)
    >>> print(now)
    2018-01-05 16:02:47.929705

    2. 获取指定日期和时间

    >>> from datetime import datetime
    >>> dt=datetime(2018, 1, 1, 1, 1)
    >>> print(dt)
    2018-01-01 01:01:001

    3. datetime类型转换为timestamp

    只需要简单调用timestamp()方法

    >>> from datetime import datetime
    >>> dt=datetime(2018, 1, 1, 1, 1)
    >>> dt.timestamp()
    1514739660.0

    4. timestamp转换为datetime

    使用datetime提供的fromtimestamp()方法

    >>> from datetime import datetime
    >>> t = 1514739660.0
    >>> print(datetime.fromtimestamp(t))
    2018-01-01 01:01:00

    5. str转换为datetime

    当日期和时间为字符串时,需要把str转换为datetime,可通过datetime.strptime()实现。

    >>> from datetime import datetime
    >>> dt= datetime.strptime('2018-1-1 1:11:11', '%Y-%m-%d %H:%M:%S')
    >>> print(dt)
    2018-01-01 01:11:11

    6. datetime转换为str

    如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的。

    >>> from datetime import datetime
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
    >>> now.strftime('%Y-%m-%d %H:%M:%S')
    '2018-01-05 16:22:50'

    7. datetime加减

    对日期和时间进行加减需要导入timedelta这个类

    >>> from datetime import datetime, timedelta
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
    >>> now + timedelta(hours=10)
    datetime.datetime(2018, 1, 6, 2, 22, 50, 394736)
    >>> now - timedelta(days=10)
    datetime.datetime(2017, 12, 26, 16, 22, 50, 394736)
    >>> now + timedelta(days=10, hours=12)
    datetime.datetime(2018, 1, 16, 4, 22, 50, 394736)
    >>> (now + timedelta(days=10, hours=12)).total_seconds()
    把timedelta转成时间戳
     

    8.时区tzinfo

    TypeError: can't compare offset-naive and offset-aware datetimes
    复制代码
    # 这是因为两个时间不属于同一类型,offset-naive是不含时区的类型,而offset-aware是有时区类型,两者自然不能比较。
    
    # 我们可以通过判断datetime对象的tzinfo属性,来获悉他是何种类型
    
    import datetime
     
    import pytz
     
    now=datetime.datetime.now() # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000)
     
    now.tzinfo==None #True

    复制代码
    1
    2
    3
    # 上述代码中now就是一个offset-naive型,就是一个不含时区的datetime。下面代码可以把它转换为一个含时区的offset-aware型:
     
    now=now.replace(tzinfo=pytz.timezone('UTC')) # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000, tzinfo=<UTC>)
    1
    2
    # 同样的,将一个offset-aware型转换为offset-naive型:
    now=now.replace(tzinfo=None)

      

    小结

    datetime模块定义了5个类:

    序号含义
    1 datetime.datetime 表示日期时间的类
    2 datetime.timedelta 表示时间间隔,即两个时间点的间隔
    3 datetime.date 表示日期的类
    4 datetime.time 表示时间的类
    5 datetime.tzinfo 时区的相关信息
    1
    # 因为数据库都是有时区'UTC'的datetime类型,<br># 所以先转换成无时区的类型now.replace(tzinfo=None))<br># 然后datetime.timedelta().total_seconds()获取时间差,然后获取时间戳(数字 )
    1
    2
    now = datetime.datetime.now()
    minus_time = (now - token_obj.created.replace(tzinfo=None)).total_seconds()<br><br>

    转载博客:https://www.cnblogs.com/amber-liu/p/10120503.html

  • 相关阅读:
    Silverlight 2 <vsm:Setter ...和<Setter ...的区别
    [原]获取指定日期WeekOfMonth
    [转]探求真正的SOA
    [转]SOA,现在进行时
    网络尖兵(NetSniper)专题
    老公必读44条守则
    Cisco2620路由器的配置与维护
    2007年银行业从业人员资格考试试题及参考答案
    可亲的“魅力水城”聊城
    我的650装机软件(供新手参考)
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14263490.html
Copyright © 2011-2022 走看看