服务器发送一个字符串,I striptime
并保存在一个名为time_from_frontend
的变量中,然后添加一个如下所示的tzinfo:
import pytz
my_timezone = pytz.timezone("America/Guayaquil")
A = time_from_frontend.replace(tzinfo=my_timezone)
print A
print A.tzinfo
B = (datetime.datetime.today()).replace(tzinfo=my_timezone)
print B
print B.tzinfo
print B - A
为什么a和B的差别很大?以下是终端打印的内容:
^{pr2}$前端向我发送实际时间,当我指定时区时,我以为a时间和B时间之间会有微小的差别(即微秒),但我得到了5个小时。这是时区差异(“美洲/瓜亚基尔”是GMT-5)。在
我有点理解这个错误。但我该怎么解决呢?有没有办法创建一个与本地时间相对应的datetime.today()
对象?在
我猜您前端的
datetime
是UTC格式的。执行替换操作实际上不会转换日期时间。它使用data/hour/等,只使用一个新的时区。在当您调用
datetime.today()
时,您将创建一个不带任何时区信息的原始datetime。当您对此进行replace
操作时,它实际上也没有进行转换,它只是假设您给它的日期已经在您提供的时区中,与您在服务器时间上所做的替换相同。在要将datetime转换为另一个时区,您需要使用^{} 。如果来自服务器的datetime也是天真的,并且没有指定时区,
astimezone
将出错。来解决这个问题。首先添加UTC
的时区。在datetime.today()
已经返回本地日期时间(结果与datetime.now()
几乎相同)。两者都将本地时间作为原始日期时间对象返回(除非要立即显示,否则请避免使用它们)。在获取给定时区中当前时间的正确方法是使用^{} :
即使在DST转换期间,当本地时间可能不明确时,它也可以工作(在这种情况下,使用朴素的
datetime.today()
可能失败)。在tzlocal
返回一个pytz
tzinfo对象,因此它处理过去可能具有不同UTC偏移量的时区(在这种情况下,非pytz代码可能会失败)。在您的代码中有几个问题:
问题中的时差表明
^{pr2}$time_from_frontend
可能是以UTC(不是本地时区)作为@Brendan Abel suggested的。要将其与当前时间进行比较,可以使用datetime.utcnow()
,如果time_from_frontend
是表示UTC时间的原始日期时间对象:要获取时区感知日期时间,您可以use ^{} with UTC timezone (the utc offset is fixed it is always zero), :
如果两个datetime对象都是时区识别的,那么减法也可以工作:
另请参见:
相关问题 更多 >
编程相关推荐