美文网首页
Python的收集整理:datetime模块

Python的收集整理:datetime模块

作者: 多喝酸奶 | 来源:发表于2017-01-20 11:06 被阅读0次

    datetime模块

    将最近收集到的datetime模块的用法进行了一些梳理,其中一些内容参考了廖雪峰指尖跳动的精灵的博客,时不时会更新。

    datetime模块常用的有datetime(日期时间),date(日期),time(时间),timedelta(时间范围),timezone(时区)这几个类。

    datetime类

    datetime模块中含有datetime类,导入时注意。

    创建

    from datetime import datetime
    
    dt = datetime(2016,12,25,18,28,32) #创建2016年12月25日18点28分32秒的datetime
    

    datetime转为timestamp

    ts = dt.timestamp()
    

    timestamp转为datetime

    dt = datetime.fromtimestamp(ts[, tz])  #本地时间,参数tz指定时区信息
    dt_utc = datetime.utcfromtimestamp(ts)  #UTC时间
    

    datetime转为str

    strdt = dt.strftime('%a %b,%Y-%m-%d %H:%M:%S')
    

    str转为datetime

    dt = datetime.strptime('2016-12-25 18:28:32', '%Y-%m-%d %H:%M:%S')
    

    其中括号里的字符串代表想要转成的格式

    格式表:(注意大小写)

    符号 含义 样式
    %Y 2016
    %m 12
    %d 日(在月中) 25
    %a 周(英文简写) Mon
    %A 周(英文全写) Monday
    %b 月(英文简写) Dec
    %B 月(英文全写) December
    %H 时(24) 18
    %p AM或者PM PM
    %I 时(12) 6
    %M 28
    %S 32
    %f 微秒 4321

    其他:
    %c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
    %j: 日在年中的天数 [001,366](是当年的第几天)
    %U: 周在当年的周数当年的第几周),星期天作为周的第一天
    %w: 今天在这周的天数,范围为[0, 6],6表示星期天
    %W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
    %x: 日期字符串(如:04/07/10)
    %X: 时间字符串(如:10:43:39)
    %y: 2个数字表示的年份
    %z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
    %Z: 时区名称(如果是本地时间,返回空字符串)

    datetime加减

    注意:加减需要导入timedelta这个类

    from datetime import datetime, timedelta
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
    >>> now + timedelta(hours=10)
    datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
    >>> now - timedelta(days=1)
    datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
    >>> now + timedelta(days=2, hours=12)
    datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
    

    时区问题

    datetime有时区,默认为当前系统时区。timestamp没有时区概念

    本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

    2015-04-19 12:20:00  
    

    实际上就是UTC+8:00时区的时间:

    2015-04-19 12:20:00 UTC+8:00  
    

    而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

    2015-04-19 04:20:00 UTC+0:00
    

    一个datetime类型有一个时区属性tzinfo,但是默认为None,无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区。

    >>> from datetime import datetime, timedelta, timezone
    >>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
    >>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
    >>> dt
    datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
    

    时区转换

    我们可以先通过utcnow()拿到当前的UTC时间,再转换为任意时区的时间:

    # 拿到UTC时间,并强制设置时区为UTC+0:00:
    >>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
    >>> print(utc_dt)
    2015-05-18 09:05:12.377316+00:00
    
    # astimezone()将转换时区为北京时间:
    >>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
    >>> print(bj_dt)
    2015-05-18 17:05:12.377316+08:00
    
    # astimezone()将转换时区为东京时间:
    >>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
    >>> print(tokyo_dt)
    2015-05-18 18:05:12.377316+09:00
    
    # astimezone()将bj_dt转换时区为东京时间:
    >>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
    >>> print(tokyo_dt2)
    2015-05-18 18:05:12.377316+09:00
    

    时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。

    利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

    注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime都可以正确转换,例如上述bj_dt到tokyo_dt的转换。

    其他属性方法

    dt.year dt.month dt.day dt.hour .... #返回年,月,日,时等,类型为整数
    
    datetime.today()  #返回一个表示当前本地时间的datetime对象
    
    datetime.now([tz])  #返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间
    
    datetime.utcnow()  #返回一个当前utc时间的datetime对象
    
    datetime.combine(date, time)  #根据date和time,创建一个datetime对象
    
    datetime.date()  #获取date对象
    
    datetime.time()  #获取time对象
    
    datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])   #替换,返回新datetime对象,原datetime不变
    
    datetime.weekday()  #返回datetime的星期,周一返回0,周二返回1,。。。
    
    datetime.isoweekday()  #返回datetime的星期,周一返回1,周二返回2,。。。
    
    datetime.isocalendar()  #返回(年,周数,星期)的元组
    
    datetime.isoformat()  #返回'YYYY-MM-DDTHH:MM:SS.mmmmmm'的字符串
    

    date类

    创建

    import datetime
    #创建2016年12月26日的date类型
    d = datetime.date(2016,12,26)
    #年的范围1~9999
    #月的范围1~12  注意不要写0
    #日的范围根据月定  注意不要写0
    

    timestamp转为date

    #参数位时间戳,返回一个date 类
    d = datetime.date.fromtimestamp(timestamp)
    

    date转为str

    s = d.strftime(%Y-%m-%d)
    #字符串格式如datetime类中所述
    

    date加减,比较

    注意:加减需要导入timedelta这个类

    date1 > date2
    date1 = date2 + timedelta
    timedelat = date1 - date2
    

    其他属性方法

    datetime.date.today() #返回当前日期
    
    d.year d.month d.day #返回date的年,月,日,类型为整数
    
    d.replace(day=25)  #用新的年,月,日替换,返回替换后的新date,不改变原date
    
    d.weekday()  #返回date的星期,周一返回0,周二返回1,。。。
    
    d.isoweekday()  #返回date的星期,周一返回1,周二返回2,。。。
    
    d.ioscalendar()  #返回(年,周数,星期)的元组
    
    d.isoformat()  #返回'YYYY-MM-DD'的字符串
    

    time类

    注意:time类也有时区的概念

    创建

    import datetime
    #创建15点32分25秒4321微秒的time类型
    t = datetime.time(15,32,25,4321)
    #hour的范围为[0, 24)
    #minute的范围为[0, 60)
    #second的范围为[0, 60)
    #microsecond的范围为[0, 1000000)
    #还可加一个tzinfo的时区参数
    

    time转化str

    s = t.strftime(%H:%M:%S)
    #字符串格式如datetime类中所述
    

    其他属性方法

    t.hour t.minute t.second t.microsecond   #返回time的时、分、秒、微秒,类型为整数
    
    t.tzinfo  #返回时区信息
    
    t.replace(hour=16)   #用新的时、分、秒、微秒替换,返回替换后的新time,不改变原time
    
    t.isoformat()  #返回'HH:MM:SS.mmmmmm'的字符串
    

    timedelta类

    创建

    import datetime
    td = datetime.timedelta(days=60)
    #可用参数
    timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
    

    使用

    now = datetime.datetime.now()
    #2017-06-19 10:13:03,901942
    td = datetime.timedelta(days=60)
    tl = now-td
    #2017-04-20 10:13:03,901942
    tf = now+td
    #2017-08-18 10:13:03,901942
    

    相关文章

      网友评论

          本文标题:Python的收集整理:datetime模块

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