· 介绍 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

如果北京时间 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 # 日期+时间