[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)
```
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟