美文网首页
datetime模块

datetime模块

作者: 胃痛的香蕉1 | 来源:发表于2018-09-10 13:40 被阅读0次

    Datetime模块探索

    写在前面

    本文介绍了Datetime,常用的内容

    • naive datetime和 aware datetime 的概念
    • datetime.date datetime.time datetime.datetime
    • 时间之间的运算方法datetime.timedelta
    • 使用pytz时区包,让datetime成为aware datetime

    naive datetime and aware datetime

    在介绍之前我们线了解一下什么是naive datetimeaware datetime

    根据词面意思来理解就是 "考虑不周全的时间日期" 和 "考虑周全的时间日期",它只是两种抽象的概念

    • naive datetime 没有时区信息,它提供的信息不如aware datetime时间类型详细,但是它很方便使用,如果你不需要很难详细的时间信息,可以使用naive datetime
    • aware datetime 如果需要使用时区信息,并且想避免一些信息的混乱最好使用aware datetime

    naive datetime

    先来看看 naive datetime,它是没有时区信息的时间类型

    datetime中分成三个大部分,其中,

    • datetime.date:date部分只含有年 月 日信息
    • datetime.time:time部分只含有时 分 秒 微秒
    • datetime.datetime:datetime部分包含datetime 两部分的信息,也就是包含年 月 日 时 分 秒 微秒

    datetime.date

    datetime.date 对象只能创建 年 月 日 这样的日期

    创建自定义日期

    注意:个位数的月和日前面不要加‘0’

    import datetime
    
    d = datetime.date(2016,7,24)
    print(d)
    
    2016-07-24
    

    获取本地时间

    tday = datetime.date.today()
    print(tday)
    
    2018-09-07
    

    分别获取本地时间种的年,月,日,周

    # 获取年
    print(tday.year)
    # 获取月
    print(tday.month)
    # 获取日
    print(tday.day)
    # 获取星期几,0-6代表周一到周天
    print(tday.weekday())
    # 获取星期几,1-7代表周一到周天
    print(tday.isoweekday())
    
    2018
    9
    7
    4
    5
    

    datetime.timedelta

    datetime.timedelta方法可以对时间进行运算操作

    获得七天后的日期

    import datetime
    # 获得本地日期
    tday = datetime.date.today()
    # 定义操作时间 day=7 也就是可以对另一个时间对象加7天或者减少7点
    tdelta = datetime.timedelta(days=7)
    
    # 打印今天的日期
    print('今天的日期:{}'.format(tday))
    # 打印七天后的日期
    print('从今天向前推7天:{}'.format(tday + tdelta))
    
    今天的日期:2018-09-07
    从今天向前推7天:2018-09-14
    

    日期相加减运算规律

    datetime.date对象 = datetime.date对象 ± datetime.timedelta对象

    datetime.timedelta对象 = datetime.date对象 ± datetime.date对象

    date2 = date1 + timedelta

    timedelta = date2 - date1

    定义datetime.date对象,定义datetime.timedelta对象,相加运算得到datetime.date对象

    # date1
    date1 = datetime.date.today()
    # timedelta
    lta = datetime.timedelta(days=6)
    # date2 = date1 + timedelta
    date2 = date1 + lta
    

    查看date1是否是datetime.date对象

    type(date1)
    
    datetime.date
    

    查看lta是否是datetime.timedelta对象

    type(lta)
    
    datetime.timedelta
    

    验证datetime.timedelta对象 = datetime.date对象 ± datetime.date对象

    lta == date2 -date1
    
    True
    

    计算某日离今日有多少天

    接着上面的计算法则我们就能很轻松的知道我们通过计算得到的结果是一个datetime.timedelta对象

    让我们来计算一下从今天到我的生日还有几天,我今年的生日是2018-10-24

    # 生日
    bday = datetime.date(2018,10,24)
    # 今天的日期
    tday = datetime.date.today()
    # 距离生日还有几天
    days = bday - tday
    print('生日:{}'.format(bday))
    print('今天的日期:{}'.format(tday))
    print('距离生日还有{}天'.format(days))
    
    生日:2018-10-24
    今天的日期:2018-09-07
    距离生日还有47 days, 0:00:00天
    

    让我们来验证一下是不是和上一条运算法则能对上

    print('{}-{}={}'.format(type(bday),type(tday),type(days)))
    
    <class 'datetime.date'>-<class 'datetime.date'>=<class 'datetime.timedelta'>
    

    果然是 datetime.date - datetime.date = datetime.timedelta

    datetime.time

    datetime.time只能生成 小时 分钟 秒 微秒这样的时间

    t = datetime.time(9, 30, 45, 100000)
    print(t)
    
    09:30:45.100000
    

    分别获取datetime.time对象的 小时 分钟 秒 微秒

    print(t.hour)
    print(t.minute)
    print(t.second)
    print(t.microsecond)
    
    9
    30
    45
    100000
    

    datetime.datetime

    由于

    datetime.date对象只能生成年 月 日

    datetime.time对象 只能生成 小时 分钟 秒 微秒

    如果我们想用 年 月 日 小时 分钟 秒 微秒这样的日期时间,这时候就需要datetime.datetime对象出场啦

    import datetime
    dt = datetime.datetime(2016, 7, 26, 12, 30, 45, 100000)
    
    2016-07-26 12:30:45.100000
    

    查看datetime.datetime对象创建的对象类型,是datetime.datetime类型

    print(dt)
    print(type(dt))
    
    2016-07-26 12:30:45.100000
    <class 'datetime.datetime'>
    

    通过datetime.datetime类型的实例对象直接.date()就能获得相应的datetime.date对象

    print(dt.date())
    print(type(dt.date()))
    
    2016-07-26
    <class 'datetime.date'>
    

    通过datetime.datetime类型的实例对象直接.time()就能获得相应的datetime.time对象

    print(dt.time())
    print(type(dt.time()))
    
    12:30:45.100000
    <class 'datetime.time'>
    

    datetime.timedelta

    datetime.datetime对象遵循着之前的运算法则

    即:
    datetime.timedelta对象 = datetime.datetime对象 ± datetime.datetime对象

    import datetime
    
    dt = datetime.datetime(2018, 9, 7, 21, 28, 45, 100000)
    
    tdelta = datetime.timedelta(days=12)
    
    print(dt + tdelta)
    
    2018-09-19 21:28:45.100000
    

    datetime.datetime.(today()\now()\utcnow())

    import datetime
    
    dt_today = datetime.datetime.today()
    dt_now = datetime.datetime.now()
    dt_utcnow = datetime.datetime.utcnow()
    
    
    print(dt_today)
    print(dt_now)
    print(dt_utcnow)
    
    2018-09-08 10:51:31.000266
    2018-09-08 10:51:31.000266
    2018-09-08 02:51:31.000266
    

    对比today()now()utcnow()之间的差异

    从上面可以看出

    • datetime.datetime.today()返回本地datetime,不会返回时区
    • datetime.datetime.now()返回本地datetime,且可以返回时区,如果你在括号种不传入时区,today()和now()就是一样的
    • datetime.datetime.utcnow()返回UTC时间,北京时间就是UTC+8

    aware datetime

    pytz时区包

    接着上面我们就来讨论这个aware datetime,其实也就是加了时区的datetime

    由于datetime并没有提供产生时区的模块,所以我们得使用第三方包pytz(python time zone)

    如果没有这个包的小伙伴可以自行安装

    pip install pytz
    

    datetime.datetime()

    import datetime
    import pytz
    
    dt = datetime.datetime(2018, 9, 15, 21, 47, 45, tzinfo=pytz.UTC)
    print(dt)
    
    2018-09-15 21:47:45+00:00
    

    在datetime.datetime()种传入 年 月 日 时 分 秒 时区,得到结果2018-09-15 21:47:45+00:00最后加号后面的那几位就是时区偏移量

    datetime.datetime.now()

    同样datetime.datetime.now()也可以传入时区

    import datetime
    import pytz
    
    dt_now = datetime.datetime.now(tz=pytz.UTC)
    print(dt_now)
    
    2018-09-08 02:45:49.984126+00:00
    

    datetime.datetime.utcnow()

    同样datetime.datetime.utcnow()也可以传入时区,不过麻烦很多,效果和上面的datetime.datetime.now()一样,建议使用上面哪种

    import datetime
    import pytz
    
    dt_utcnow = datetime.datetime.utcnow().replace(tzinfo=pytz.UTC)
    print(dt_utcnow)
    
    2018-09-08 02:45:51.467272+00:00
    

    使用不同时区生成时间

    查看pytz时区列表

    import pytz
    for tz in pytz.all_timezones:
        print(tz)
    
    Africa/Abidjan
    Africa/Accra
    Africa/Addis_Ababa
    Africa/Algiers
    Africa/Asmara
    Africa/Asmera
    .......
    US/Samoa
    UTC
    Universal
    W-SU
    WET
    Zulu
    

    生成'US/Mountain'时间

    import datetime
    import pytz
    
    # 这是UTC时间
    dt_now = datetime.datetime.now(tz=pytz.UTC)
    # 这是`'US/Mountain'`时间
    dt_min = dt_now.astimezone(pytz.timezone('US/Mountain'))
    print(dt_now)
    print(dt_min)
    
    2018-09-07 13:58:25.595771+00:00
    2018-09-07 07:58:25.595771-06:00
    

    中国的时间只有上海时间

    import datetime
    import pytz
    
    # 获取UTC时间
    dt_now = datetime.datetime.now(tz=pytz.UTC)
    # 这是`'US/Mountain'`时间
    dt_min = dt_now.astimezone(pytz.timezone('Asia/Shanghai'))
    print(dt_now)
    print(dt_min)
    
    2018-09-08 02:58:05.581227+00:00
    2018-09-08 10:58:05.581227+08:00
    

    如果不需要时区

    import datetime
    dt_now = datetime.datetime.now()
    print(dt_now)
    
    2018-09-08 10:54:14.658342
    

    如果需要时区

    import datetime
    import pytz
    dt_now = datetime.datetime.now(tz=pytz.UTC)
    dt_min = dt_now.astimezone(pytz.timezone('Asia/Shanghai'))
    
    

    注意 naive time 不能使用.astimezone方法来改变时区,只有 aware time可以

    字符串和datetime之间的转化

    python中时间日期格式化符号:

    • %y 两位数的年份表示(00-99)
    • %Y 四位数的年份表示(000-9999)
    • %m 月份(01-12)
    • %d 月内中的一天(0-31)
    • %H 24小时制小时数(0-23)
    • %I 12小时制小时数(01-12)
    • %M 分钟数(00=59)
    • %S 秒(00-59)
    • %a 本地简化星期名称
    • %A 本地完整星期名称
    • %b 本地简化的月份名称
    • %B 本地完整的月份名称
    • %c 本地相应的日期表示和时间表示
    • %j 年内的一天(001-366)
    • %p 本地A.M.或P.M.的等价符
    • %U 一年中的星期数(00-53)星期天为星期的开始
    • %w 星期(0-6),星期天为星期的开始
    • %W 一年中的星期数(00-53)星期一为星期的开始
    • %x 本地相应的日期表示
    • %X 本地相应的时间表示
    • %Z 当前时区的名称
    • %% %号本身

    字符串转datetime

    strptime - String to Datetime

    import datetime
    import pytz
    
    dt_str = 'July 26 2016'
    
    dt = datetime.datetime.strptime(dt_str,'%B %d %Y')
    
    print(dt)
    
    2016-07-26 00:00:00
    

    datetime转字符串

    strftime - Datettime to String

    import datetime
    import pytz
    
    dt = datetime.datetime.now(tz=pytz.UTC)
    
    
    dt_min = dt.astimezone(pytz.timezone('Asia/Shanghai'))
    
    dt_min.strftime('%B %d %Y %Z')
    
    'September 10 2018 CST'
    

    相关文章

      网友评论

          本文标题:datetime模块

          本文链接:https://www.haomeiwen.com/subject/qbksgftx.html