使用pytz和datetime模块在strptime和strftime之间转换时间时看到的差异 &g


original_value = (datetime.datetime.now(pytz.utc)) + datetime.timedelta(minutes=30)
current_schedule = original_value..strftime("%Y-%m-%dT%H:%M:%S.%fZ")
new_value = datetime.datetime.strptime(current_schedule,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()

现在理论上original_value.timestamp()应该等于new_value变量,但是人们会注意到一个相当于或至少接近他们的机器所在时区的时差。对我来说,大约是17000秒或19000秒,这也不一致。

如何始终如一地发现它们之间的差异为0秒,因为理想情况下它们应该是0秒。

使用的函数:

import datetime
import pytz
ab = (datetime.datetime.now(pytz.utc)) + datetime.timedelta(minutes=30)
current_schedule = ab.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
new_time = datetime.datetime.strptime(current_schedule,"%Y-%m-%dT%H:%M:%S.%fZ").timestamp()
print("Value Initially: {}".format(ab.timestamp()))
print("Value post converstion: {}".format(new_time))
time_diff = new_time - ab.timestamp()
print(time_diff)

输出:

Value Initially: 1680806908.778667
Value post converstion: 1680787108.778667
-19800.0

请解释为什么会这样?后时间应该与前时间相同,因为它们只是从一个转换到另一个!

如何解决这个问题?

ab具有时区数据的时间

new_time = datetime.datetime.strptime(current_schedule,"%Y-%m-%dT%H:%M:%S.%fZ")

在调用时间戳方法时,将不具有使其使用本地时区作为引用的时区详细信息。因此,ab.timestamp()将使用UTC,而new_time值将使用本地时区。您得到的时间差将是本地时区和UTC之间的时间差,以秒为单位。

要解决这个问题,请在使用timestamp()之前指定时区。这可以通过使用replace(tzinfo=pytz.UTC)或更好地使用格式"%Y-%m-%dT%H:%M:%S.%f%z"来完成。在strftimestrptime