Python之日期与时间处理模块(date和datetime)
前言 在开发工作中,我们经常需要用到日期与时间,如:
Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。 一、相关术语的解释
二、时间的表现形式 常见的时间表示形式为:
Python中还有其它的时间表示形式:
关于datetime模块的datetime类会在下面做详细讲解,这里简单说下time.struct_time。 time.struct_time包含如下属性:
属性值的获取方式有两种:
需要说明的是struct_time实例的各个属性都是只读的,不可修改。 三、 time模块 time模块主要用于时间访问和转换,这个模块提供了各种与时间相关的函数。 1. 函数列表
2. 练习 获取时间戳格式的时间 >>> time.time() 1486188022.862 获取struct_time格式的时间 >>> time.localtime() time.struct_time(tm_year=2017,tm_mon=2,tm_mday=4,tm_hour=14,tm_min=2,tm_sec=34,tm_wday=5,tm_yday=35,tm_isdst=0) >>> time.gmtime() time.struct_time(tm_year=2017,tm_hour=6,tm_sec=56,tm_isdst=0) 获取字符串格式的时间 >>> time.ctime() 'Sat Feb 04 14:06:42 2017' >>> time.asctime() 'Sat Feb 04 14:06:47 2017' 时间戳格式转struct_time格式时间 >>> t1 = time.time() >>> print(t1) 1486188476.9 >>> t2 = time.localtime(t1) >>> print(t2) time.struct_time(tm_year=2017,tm_min=7,tm_isdst=0) >>> t3 = time.gmtime(t1) >>> print(t3) time.struct_time(tm_year=2017,tm_isdst=0) >>> 字符串格式转struct_time格式时间 >>> time.strptime('Sat Feb 04 14:06:42 2017') time.struct_time(tm_year=2017,tm_min=6,tm_sec=42,tm_isdst=-1) >>> time.strptime('Sat Feb 04 14:06:42 2017','%a %b %d %H:%M:%S %Y') time.struct_time(tm_year=2017,tm_isdst=-1) >>> time.strptime('2017-02-04 14:12','%Y-%m-%d %H:%M') time.struct_time(tm_year=2017,tm_min=12,tm_sec=0,tm_isdst=-1) >>> time.strptime('2017/02/04 14:12','%Y/%m/%d %H:%M') time.struct_time(tm_year=2017,tm_isdst=-1) >>> time.strptime('201702041412','%Y%m%d%H%M') time.struct_time(tm_year=2017,tm_isdst=-1) struct_time格式转字符串格式时间 >>> time.strftime('%Y-%m-%d %H:%M',time.localtime()) '2017-02-04 14:19' struct_time格式转时间戳格式时间 >>> time.mktime(time.localtime()) 1486189282.0 3. 时间格式转换 时间戳格式的时间 与 字符串格式的时间 虽然可以通过ctime([secs])方法进行转换,但是字符串格式不太适应中国国情。因此,整体而言,它们 不能直接进行转换,需要通过struct_time作为中介,转换关系如下: 说明:上面的 '%H:%M:%S' 可以直接用 '%X' 代替。 四、 datetime模块 datetime模块提供了处理日期和时间的类,既有简单的方式,又有复杂的方式。它虽然支持日期和时间算法,但其实现的重点是为输出格式化和操作提供高效的属性提取功能。 1. datetime模块中定义的类 datetime模块定义了以下几个类:
需要说明的是:这些类的对象都是不可变的。 类之间的关系: object date datetime time timedelta tzinfo timezone 2. datetime模块中定义的常量
3. datetime.date类 datetime.date类的定义 class datetime.date(year,month,day) year,month 和 day都是是必须参数,各参数的取值范围为:
类方法和属性
对象方法和属性
实例 >>> import time >>> from datetime import date >>> >>> date.max datetime.date(9999,12,31) >>> date.min datetime.date(1,1,1) >>> date.resolution datetime.timedelta(1) >>> date.today() datetime.date(2017,2,4) >>> date.fromtimestamp(time.time()) datetime.date(2017,4) >>> >>> d = date.today() >>> d.year 2017 >>> d.month 2 >>> d.day 4 >>> d.replace(2016) datetime.date(2016,4) >>> d.replace(2016,3) >>> d.replace(2016,3,2) datetime.date(2016,2) >>> d.timetuple() time.struct_time(tm_year=2017,tm_hour=0,tm_min=0,tm_isdst=-1) >>> d.toordinal() 736364 >>> d.weekday() 5 >>> d.isoweekday() 6 >>> d.isocalendar() (2017,5,6) >>> d.isoformat() '2017-02-04' >>> d.ctime() 'Sat Feb 4 00:00:00 2017' >>> d.strftime('%Y/%m/%d') '2017/02/04' 4. datetime.time类 time类的定义 class datetime.time(hour,[minute[,[microsecond[,tzinfo]]]]) hour为必须参数,其他为可选参数。各参数的取值范围为:
类方法和属性
对象方法和属性
实例 >>> from datetime import time >>> >>> time.max datetime.time(23,999999) >>> time.min datetime.time(0,0) >>> time.resolution datetime.timedelta(0,1) >>> >>> t = time(20,40,8888) >>> t.hour 20 >>> t.minute 5 >>> t.second 40 >>> t.microsecond 8888 >>> t.tzinfo >>> >>> t.replace(21) datetime.time(21,8888) >>> t.isoformat() '20:05:40.008888' >>> t.strftime('%H%M%S') '200540' >>> t.strftime('%H%M%S.%f') '200540.008888' 5. datetime.datetime类 datetime类的定义 复制代码 代码如下: class datetime.datetime(year,day,hour=0,minute=0,second=0,microsecond=0,tzinfo=None) year,month 和 day是必须要传递的参数, tzinfo可以是None或tzinfo子类的实例。 各参数的取值范围为:
如果一个参数超出了这些范围,会引起ValueError异常。 类方法和属性
对象方法和属性
实例 >>> from datetime import datetime,timezone >>> >>> datetime.today() datetime.datetime(2017,4,20,44,556318) >>> datetime.now() datetime.datetime(2017,56,572615) >>> datetime.now(timezone.utc) datetime.datetime(2017,45,22,881694,tzinfo=datetime.timezone.utc) >>> datetime.utcnow() datetime.datetime(2017,52,812508) >>> import time >>> datetime.fromtimestamp(time.time()) datetime.datetime(2017,46,41,97578) >>> datetime.utcfromtimestamp(time.time()) datetime.datetime(2017,989413) >>> datetime.combine(date(2017,4),t) datetime.datetime(2017,8888) >>> datetime.strptime('2017/02/04 20:49','%Y/%m/%d %H:%M') datetime.datetime(2017,49) >>> dt = datetime.now() >>> dt datetime.datetime(2017,57,621378) >>> dt.year 2017 >>> dt.month 2 >>> dt.day 4 >>> dt.hour 20 >>> dt.minute 57 >>> dt.second 0 >>> dt.microsecond 621378 >>> dt.tzinfo >>> dt.timestamp() 1486213020.621378 >>> dt.date() datetime.date(2017,4) >>> dt.time() datetime.time(20,621378) >>> dt.timetz() datetime.time(20,621378) >>> dt.replace() datetime.datetime(2017,621378) >>> dt.replace(2016) datetime.datetime(2016,621378) >>> dt.timetuple() time.struct_time(tm_year=2017,tm_hour=20,tm_min=57,tm_isdst=-1) >>> dt.utctimetuple() time.struct_time(tm_year=2017,tm_isdst=0) >>> dt.toordinal() 736364 >>> dt.weekday() 5 >>> dt.isocalendar() (2017,6) >>> dt.isoformat() '2017-02-04T20:57:00.621378' >>> dt.isoformat(sep='/') '2017-02-04/20:57:00.621378' >>> dt.isoformat(sep=' ') '2017-02-04 20:57:00.621378' >>> dt.ctime() 'Sat Feb 4 20:57:00 2017' >>> dt.strftime('%Y%m%d %H:%M:%S.%f') '20170204 20:57:00.621378' 6. 使用datetime.datetime类对时间戳与时间字符串进行转换 7. datetime.timedelta类 timedelta对象表示连个不同时间之间的差值。如果使用time模块对时间进行算术运行,只能将字符串格式的时间 和 struct_time格式的时间对象 先转换为时间戳格式,然后对该时间戳加上或减去n秒,最后再转换回struct_time格式或字符串格式,这显然很不方便。而datetime模块提供的timedelta类可以让我们很方面的对datetime.date,datetime.time和datetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。 datetime.timedelta类的定义 复制代码 代码如下: class datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,hours=0,weeks=0) 所有参数都是默认参数,因此都是可选参数。参数的值可以是整数或浮点数,也可以是正数或负数。内部值存储days、seconds 和 microseconds,其他所有参数都将被转换成这3个单位:
然后对这3个值进行标准化,使得它们的表示是唯一的:
类属性
实例方法和属性
实例 >>> import datetime >>> >>> datetime.timedelta(365).total_seconds() # 一年包含的总秒数 31536000.0 >>> dt = datetime.datetime.now() >>> dt + datetime.timedelta(3) # 3天后 datetime.datetime(2017,8,9,39,102821) >>> dt + datetime.timedelta(-3) # 3天前 datetime.datetime(2017,102821) >>> dt + datetime.timedelta(hours=3) # 3小时后 datetime.datetime(2017,102821) >>> dt + datetime.timedelta(hours=-3) # 3小时前 datetime.datetime(2017,6,102821) >>> dt + datetime.timedelta(hours=3,seconds=30) # 3小时30秒后 datetime.datetime(2017,10,102821) 五、时间格式码 time模块的struct_time以及datetime模块的datetime、date、time类都提供了strftime()方法,该方法可 以输出一个指定格式的时间字符串。具体格式由一系列的格式码(格式字符)组成,Python最终调用的是各个平台C库的strftme()函数,因此各平台对全套格式码的支持会有所不同,具体情况需要参考该平台上的strftime(3)文档。下面列出了C标准(1989版)要求的所有格式码,它们在所有标准C实现的平台上都可以工作: 六、总结 那么Python中处理时间时,使用time模块好,还是用datetime模块好呢?就我个人而言,datetime模块基本上可以满足需要,且用起来确实比较方便。对于time模块,我只是在取当前时间的时间戳时会用到time.time()方法,当然也可以通过datetime.datetime.now().timestamp()来获取,只是显得复杂一点。我觉得还是看个人习惯吧,没有什么绝对的好坏之分。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |