1. 问题所在
Python 维护者发现的问题来自于这些函数返回的 "幼稚 "日期时间对象。
所谓 "幼稚 "日期时间对象是指没有时区的对象,这意味着它只能在时区无关紧要或已经预先知道的情况下使用
这与 "感知 "日期时间对象形成了鲜明对比,后者确实明确地附加了时区。
2. 代码示例
from datetime import datetime, timezone
def aware_utcnow():
return datetime.now(timezone.utc)
def aware_utcfromtimestamp(timestamp):
return datetime.fromtimestamp(timestamp, timezone.utc)
def naive_utcnow():
return aware_utcnow().replace(tzinfo=None)
def naive_utcfromtimestamp(timestamp):
return aware_utcfromtimestamp(timestamp).replace(tzinfo=None)
print(aware_utcnow())
print(aware_utcfromtimestamp(0))
print(naive_utcnow())
print(naive_utcfromtimestamp(0))
# 2024-01-10 08:47:40.528148+00:00
# 1970-01-01 00:00:00+00:00
# 2024-01-10 08:47:40.528148
# 1970-01-01 00:00:00
3. python3.12 utcnow() 结果会出来,但会出现错误
from datetime import datetime, timedelta, timezone
eta = datetime.utcnow()
local_eta = datetime.now()
print(eta) # 2024-01-10 08:49:46.441464
print(local_eta) # 2024-01-10 16:49:46.441464
会打印正确的时间,但会报一个错误如下,怎么把这个错误去掉
DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
eta = datetime.utcnow()
解决
from datetime import datetime, timedelta, timezone
eta = datetime.now(timezone.utc)
local_eta = datetime.now()
print(eta) # 2024-01-10 08:52:13.080183+00:00
print(local_eta) # 2024-01-10 16:52:13.080183
就不会出现问题,但是这个返回的时间带有+00:00,怎么去掉
from datetime import datetime, timedelta, timezone
eta = datetime.now(timezone.utc).replace(tzinfo=None)
local_eta = datetime.now()
print(eta) # 2024-01-10 08:54:01.291963
print(local_eta) # 2024-01-10 16:54:01.291963