获取代表当前日期和时间的 datetime 对象

  1. from datetime import datetime
  2. now = datetime.now()
  3. print(now) # 2020-01-08 00:16:12.865886

从指定的日期和时间获取 datetime 对象

  1. from datetime import datetime
  2. dt = datetime(2020, 1, 7, 23, 59)
  3. print(dt) # 2020-01-07 23:59:00

datetime 对象与 timestamp(时间戳)的相互转换

在计算机中,时间实际上是用数字表示的。我们把 1970 年 1 月 1 日 00:00:00 UTC+00:00 时区的时刻称为 epoch time,记为 0,当前时间就是相对于 epoch time 的秒数,称为 timestamp(1970 年以前的时间 timestamp 为负数)。

timestamp 的值与时区毫无关系,因为 timestamp 一旦确定,其 UTC 时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以 timestamp 表示的,因为全球各地的计算机在任意时刻的 timestamp 都是完全相同的。

datetime 对象转换为 timestamp

  1. from datetime import datetime
  2. dt = datetime(2020, 1, 7, 23, 59)
  3. dt.timestamp() # 1578412740.0


:::warning 注意:Python 的 timestamp 是一个浮点数整数位表示秒数,小数位表示毫秒数。而 JavaScript、Java 等语言中,timestamp 是一个整数,表示毫秒数。 :::

timestamp 转换为 datetime 对象

  1. from datetime import datetime
  2. t = 1578412740.0
  3. dt = datetime.fromtimestamp(t)
  4. print(dt) # 2020-01-07 23:59:00

datetime 对象与字符串的相互转换

字符串转 datetime

  1. from datetime import datetime
  2. dt = datetime.strptime("2020-1-7 23:59:59", "%Y-%m-%d %H:%M:%S")
  3. print(dt) # 2020-01-07 23:59:00

:::info 字符串 %Y-%m-%d %H:%M:%S 规定了日期和时间的格式。详细的说明可以参考 Python 文档。 :::

datetime 转字符串

  1. from datetime import datetime
  2. now = datetime.now()
  3. strdt = now.strftime("%a, %b %d %H:%M")
  4. print(strdt) # Wed, Jan 08 00:38

datetime 加减

  1. from datetime import datetime, timedelta # 需要导入 timedelta 类
  2. now = datetime.now()
  3. print(now) # 2020-01-08 00:41:15.807337
  4. dt1 = now + timedelta(days=1)
  5. print(dt1) # 2020-01-09 00:41:15.807337
  6. dt2 = now - timedelta(hours=5, days=3)
  7. print(dt2) # 2020-01-04 19:41:15.807337

改变 datetime 对象的时区信息

datetime 对象默认使用是本地时区,即如果在国内,用的是 UTC+08:00

所以下面这种情况下计算的时间戳是错的:

  1. from datetime import datetime
  2. dt = datetime.fromisoformat('2022-02-19T10:08:53.000000')
  3. dt.timestamp()

2022-02-19T10:08:53.000000 是符合 ISO 8601 格式的 UTC 时间,然而 datetime.fromisoformat() 将其当作 UTC+08:00 时间转换成了 datetime 对象,因此使用 dt.timestamp() 获取的时间戳比实际想得到的时间戳慢 8 小时。

怎么解决呢?

  1. import pytz
  2. from datetime import datetime
  3. dt = datetime.fromisoformat('2022-02-19T10:08:53.000000')
  4. dt = dt.replace(tzinfo=pytz.utc) # 将时区信息转换为 UTC
  5. dt.timestamp()