你对时间处理是不是感觉很吃力?这个文章可以解决你下面的问题:

  • Python 获取北京时间
  • Python 获取北京时间的字符串
  • Python 获取 UTC 时间
  • Python 获取 UTC 时间的字符串

获取 str 类型的当前时间

关于 offset-naiveoffset-aware 的区别

  • offset-naive 是不含时区的类型,
  • offset-aware 是有时区类型

可以参考:
避坑手册!Python 对比两个 datetime 大小的坑
received a naive datetime while time zone support is active

如果你只想以最简单的方式获取一个 iso-8601 格式的时间字符串的话,就用下面的代码:

iso-8601 格式: 2022-04-21 10:38:23.307791+08:00

offset-naive 不带时区信息

UTC 时间 和 北京时间展示

from datetime import datetime

# UTC 时区时间,offset-naive 不带时区信息
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))  # 不包含毫秒
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f'))  # 包含毫秒

# 北京时间,offset-naive 不带时区信息
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))  # 不包含毫秒
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'))  # 包含毫秒

输出结果:

2022-04-07 09:54:17
2022-04-07 09:54:17.743626

2022-04-07 17:56:07
2022-04-07 17:56:07.753445

可以看到 北京时间 比 UTC 时间多了 8 小时


offset-aware 带时区信息

UTC 时间 和 北京时间展示

from datetime import datetime, timedelta, timezone

# UTC 时区时间,offset-aware 带时区信息
print(datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%d %H:%M:%S'))  # 不包含毫秒并且不包含时区
print(datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%d %H:%M:%S%z'))  # 不包含毫秒但是包含时区
print(datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f%z'))  # 包含毫秒并且包含时区


# 北京时间,offset-aware 带时区信息
print(datetime.now().replace(tzinfo=timezone(timedelta(hours=8))).strftime('%Y-%m-%d %H:%M:%S'))  # 不包含毫秒并且不包含时区
print(datetime.now().replace(tzinfo=timezone(timedelta(hours=8))).strftime('%Y-%m-%d %H:%M:%S%z'))  # 不包含毫秒但是包含时区
print(datetime.now().replace(tzinfo=timezone(timedelta(hours=8))).strftime('%Y-%m-%d %H:%M:%S.%f%z'))  # 包含毫秒并且包含时区

输出结果:

2022-04-07 10:14:56
2022-04-07 10:14:56+0000
2022-04-07 10:14:56.441156+0000
2022-04-07 18:14:56
2022-04-07 18:14:56+0800
2022-04-07 18:14:56.441175+0800

获取 datetime 类型的当前时间

from datetime import datetime, timedelta, timezone


print(datetime.utcnow())  # 不带时区信息的 utc 时间
print(datetime.utcnow().replace(tzinfo=timezone.utc))  # 带时区信息的 utc 时间
print(datetime.now())       # 不带时区信息的 北京 时间
print(datetime.now().replace(tzinfo=timezone(timedelta(hours=8))))  # 带时区信息的 utc 时间

输出结果:

2022-04-07 10:21:07.611889
2022-04-07 10:21:07.613313+00:00
2022-04-07 18:21:07.613322
2022-04-07 18:21:07.613326+08:00

把 str 字符串转为 datetime

推荐一个万能的解析方式:
pydantic 这个库实现了 parse_datetime,能够将各种乱七八糟的时间格式字符串解析为 datetime 类型,比如带毫秒的,带时区的

from pydantic.datetime_parse import parse_datetime
from datetime import datetime, timedelta, timezone


print(parse_datetime('2022-04-07 10:11:13'))
print(parse_datetime('2022-04-07 10:11:13+0000'))

print(parse_datetime('2022-04-07 10:11:13.749788+0000'))
print(parse_datetime('2022-04-07 10:11:13.749788+0000').tzinfo)

print(parse_datetime('2022-04-07 10:11:13.749788+0800'))
print(parse_datetime('2022-04-07 10:11:13.749788+0800').tzinfo)

输出结果:

2022-04-07 10:11:13
2022-04-07 10:11:13+00:00
2022-04-07 10:11:13.749788+00:00
UTC
2022-04-07 10:11:13.749788+08:00
UTC+08:00

把 datetime 类型转为 str 字符串

直接调用 str() 函数,如果需要精确控制就用 strftime 方法


universe_king
3.4k 声望680 粉丝