多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## time & datetime 模块 在Python中,与时间处理有关的模块就包括:time、datetime。 ### 前言 #### **Python中表示时间的方式** 1. 时间戳 2. 格式化的时间字符串 3. 元组(struct\_time)共九个元素。 #### **几个时间概念定义** * UTC(Coordinated Universal Time,世界协调时) 亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。 * 时间戳(timestamp)的方式 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。 我们运行“type(time.time())”,返回的是float类型。 * 元组(struct_time)方式: struct_time元组共有9个元素,返回struct\_time的函数主要有gmtime(),localtime(),strptime(): #### **字符串转时间格式对应表** |符号 | 意义 | 补充说明 | | --- | --- | --- | |%a | 星期的简写 | 如:星期三为Web | |%A | 星期的全写 | 如:星期三为Wednesday | |%b | 月份的简写 | 如:4月份为Apr | |%B | 月份的全写 | 如:4月份为April | |%c: | 日期时间的字符串表示。| 如:04/07/10 10:43:39 | |%d: | 日在这个月中的天数 | 是这个月的第几天| |%f: | 微秒 | 范围:[0,999999] | |%H: | 小时| 24小时制,[0, 23] | |%I: | 小时| 12小时制,[0, 11] | |%j: | 日在年中的天数 | [001,366]:是当年的第几天 | |%m: | 月份| [01,12] | |%M: | 分钟| [00,59] | |%p: | AM或者PM | 上午或下午| |%S: | 秒 | 范围:[00,61] | |%U: | 当年第几周 | 星期天作为周的第一天| |%w: | 当周第几天 | 范围为[0, 6],6表示星期天 | |%W: | 当年第几周| 星期一作为周的第一天 | |%x: | 日期字符串| 如:04/07/10 | |%X: | 时间字符串| 如:10:43:39 | |%y: | 2个数字表示的年份| 19 | |%Y: | 4个数字表示的年份| 2019 | |%z: | 与utc时间的间隔 | 如果是本地时间,返回空字符串 | |%Z: | 时区名称| 如果是本地时间,返回空字符串 | |%%: | %% => %| | 索引(Index) | 属性(Attribute) | 值(Values) | | --- | --- | --- | | 0 | tm_year(年)| 比如2011 | | 1 | tm_mon(月)| 1 - 12| | 2 | tm_mday(日)| 1 - 31| | 3 | tm_hour(时) | 0 - 23| | 4 | tm_min(分) | 0 - 59| | 5 | tm_sec(秒)| 0 - 61| | 6 | tm_wday(weekday)| 0 - 6(0表示周日)| | 7 | tm_yday(一年中的第几天)| 1 - 366| | 8 | tm_isdst(是否是夏令时)| 默认为-1| ## time模块 ### `time.localtime([secs])` 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。 ``` >>> time.localtime() time.struct_time(tm_year=2019, tm_mon=1, tm_mday=20, tm_hour=13, tm_min=21, tm_sec=31, tm_wday=6, tm_yday=20, tm_isdst=0) >>> time.localtime(123456789) time.struct_time(tm_year=1973, tm_mon=11, tm_mday=30, tm_hour=5, tm_min=33, tm_sec=9, tm_wday=4, tm_yday=334, tm_isdst=0) ``` ### `time.gmtime([secs])` 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 ``` >>> `time.gmtime() ` time.struct_time(tm_year=2019, tm_mon=1, tm_mday=20, tm_hour=5, tm_min=26, tm_sec=53, tm_wday=6, tm_yday=20, tm_isdst=0) >>> time.gmtime(123456789) time.struct_time(tm_year=1973, tm_mon=11, tm_mday=29, tm_hour=21, tm_min=33, tm_sec=9, tm_wday=3, tm_yday=333, tm_isdst=0) ``` ### `time.time()` 返回当前时间的时间戳。 ``` >>> time.time() 1547962066.9111545 ``` ### `time.mktime(t)` 将一个struct_time转化为时间戳。 ``` >>> time.mktime((2019,2,17,17,3,38,1,48,0)) 1550394218.0 ``` ### `time.sleep(secs)` 线程推迟指定的时间运行。单位为秒。 ``` >>> print(time.ctime());time.sleep(3);print(time.ctime()) Sun Jan 20 13:39:45 2019 Sun Jan 20 13:39:48 2019 ``` ### `time.asctime([t])` 把一个表示时间的元组或者struct_time表示为这种形式:'Sun Oct 1 12:04:38 2017'。如果没有参数,将会将time.localtime()作为参数传入。 ``` >>> time.asctime() 'Sun Jan 20 13:44:08 2019' >>> time.asctime((2019,2,17,17,3,38,1,48,0)) 'Tue Feb 17 17:03:38 2019' ``` ### `time.ctime([secs])` 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于`time.asctime(time.localtime(secs))`。 ``` 'Sun Jan 20 13:46:37 2019' >>> time.ctime(1547963185.4658437) 'Sun Jan 20 13:46:25 2019' ``` ### **`time.strftime(format[, t])`** 把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。 ``` >>> time.strftime("%Y-%m-%d %X", time.localtime()) '2019-01-20 13:49:39' >>> time.strftime("%Y-%m-%d %X", (2019,2,17,17,3,38,1,48,0)) '2019-02-17 17:03:38' ``` ### `time.strptime(string[, format]` 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。 ``` >>> time.strptime('2019-10-3 17:54',"%Y-%m-%d %H:%M") time.struct_time(tm_year=2019, tm_mon=10, tm_mday=3, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=3, tm_yday=276, tm_isdst=-1) ``` ### **总结:时间关系转换图** ![时间关系转换图](https://www.github.com/noah-luo/imags/raw/master/year/1547964593183.png) ## datetime模块 相比于time模块,datetime模块的接口则更直观、更容易调用 ### datetime模块定义了下面这几个类 * datetime.date:表示日期的类。常用的属性有year, month, day; * datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond; * datetime.datetime:表示日期时间。 * datetime.timedelta:表示时间间隔。即两个时间点之间的长度。 * datetime.tzinfo:与时区有关的相关信息 ### `datetime.datetime.now() ` 返回当前的datetime日期类型,有很多后续方法可以调用 ``` d=datetime.datetime.now() >>> d datetime.datetime(2019, 1, 20, 14, 22, 31, 209699) >>> d.ctime() 'Sun Jan 20 14:22:31 2019' >>> d.timestamp() 1547965351.209699 >>> d.time() datetime.time(14, 22, 31, 209699) >>> d.day 20 >>> d.year 2019 >>> d.timetuple() time.struct_time(tm_year=2019, tm_mon=1, tm_mday=20, tm_hour=14, tm_min=22, tm_sec=31, tm_wday=6, tm_yday=20, tm_isdst=-1) ``` ### `datetime.date.fromtimestamp(时间戳) ` 把一个时间戳转为datetime日期类型 ``` >>> datetime.date.fromtimestamp(1547965351.209699) datetime.date(2019, 1, 20) ``` ### 时间运算 ``` >>> datetime.datetime.now() datetime.datetime(2017, 10, 1, 12, 53, 11, 821218) >>> datetime.datetime.now() + datetime.timedelta(4) #当前时间 +4天 datetime.datetime(2017, 10, 5, 12, 53, 35, 276589) >>> datetime.datetime.now() + datetime.timedelta(hours=4) #当前时间+4小时 datetime.datetime(2017, 10, 1, 16, 53, 42, 876275)``` ``` ### 时间替换 ``` >>> d.replace(year=2999,month=11,day=30) datetime.date(2999, 11, 30) ```