你对时间处理是不是感觉很吃力?这个文章可以解决你下面的问题:
- Python 获取北京时间
- Python 获取北京时间的字符串
- Python 获取 UTC 时间
- Python 获取 UTC 时间的字符串
获取 str 类型的当前时间
关于 offset-naive
和 offset-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
方法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。