· 介绍 Python 标准库 datetime
时间概念
需要先厘清几个概念
- 物理时间:物理概念时间,不断流逝的时间
- 时间戳:从世界标准时间(UTC,Coordinated Universal Time)的 1970 年 1 月 1 日 0 时 0 分 0 秒开始的偏移量。
- UTC 时间:其以原子时的秒长为基础,在时刻上尽量接近于格林威治标准时间。
- 时区:在 UTC 时间上偏移多少个小时,例如北京位于东八区,时间就在 UTC 时间上增加 8 小时,
- 时间字符串:表示时间的人类可读的字符串。
- RFC 2822: 形如
Tue, 1 Jul 2003 10:52:37 +0200
- RFC 3339: 形如
1996-12-19T16:39:57-08:00
- ISO 8601: 和 RFC 3339 的区别见 RFC3339-ISO8601
- RFC 2822: 形如
如果北京时间 2023 年 1 月 1 日 8 点钟。这个 8 点钟是指东 8 区的 8 点钟。对应的 UTC 时间就是 2023 年 1 月 1 日 0 点。对应的毫秒时间戳就是 1672531200000。RFC3339 字符串为2023-01-01T08:00:00+08:00
概念记忆推进如下:
物理时间——> 时间戳 ——> UTC 时间 ——> 带有时区信息的时间
例子
datetime 模块里面的类名都没有首字母大写。并且存在一个 datetime 类,类名与模块名字一模一样,容易混淆。使用时注意,from datetime import datetime
。才会从 datetime 模块导入 datetime 类。如果直接import datetime
,会导入模块,使用时需要用datetime.datetime
来表示 datetime 类
from datetime import datetime,timedelta
# 获取当前时间。下面几个都是类方法classmethod
print(datetime.utcnow())
print(datetime.now()) # 当前时区的时间,返回的类型是datetime类
print(datetime.now().timestamp()) # 输出float的时间戳中点前面的是秒,点后面是毫秒
# 时间的加减
now = datetime.now()
now + timedelta(hours=8) # 增加8小时
#与时间字符串的相互转换
nowstr = now.strftime('%Y-%m-%d %H:%M:%S') # strftime是str format time的缩写
now = datetime.strptime('2023-06-26 00:59:15','%Y-%m-%d %H:%M:%S')
## 从rfc3339字符串转换为datetime
rfc3339_str = "2023-06-25T14:30:00.000Z"
datetime.fromisoformat(rfc3339_str)
datetime模块的源码讲解
datetime 模块的源码 继承关系如下
object
timedelta # 这个类表示时间间隔
tzinfo
timezone #时区信息
time
date # 日期
datetime # 日期+时间