蟒蛇。 如何使用datetime.today()创建本地日期时间
服务器发送一个字符串,我将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之间有很大的区别? 这是终端打印的内容:
2016-02-11 20:00:00-05:19
America/Guayaquil
2016-02-12 01:08:35.478507-05:19
America/Guayaquil
5:08:35.478507
前端向我发送实际的时间,当我做datetime.today()
然后指定时区时,我认为我会在A时间和B时间(即微秒)之间得到微小的差异,但是我得到了5个小时。 这是时区差异(“America / Guayaquil”是格林威治标准时间-5)。
我有点理解错误。 但我该如何解决它? 有没有办法创建一个对应于当地时间的datetime.today()对象?
我猜你的前端的datetime
时间是UTC。 做替换实际上不会转换日期时间。 它使用数据/小时/等。 并只使用一个新的时区。
当你调用datetime.today()
,你创建一个没有任何时区信息的天真日期时间。 当你做一个replace
时,它实际上并没有进行转换,它只是假定你给它的日期已经在你提供的时区,就像你在服务器时间做的替换一样。
要将日期时间实际转换为另一个时区,您需要使用astimezone
。 如果服务器的日期时间也很幼稚并且没有指定时区,则astimezone
将会出错。 解决这个问题。 首先添加UTC
的时区。
time_from_frontend = time_from_frontend.replace(tzinfo=pytz.timezone('UTC'))
converted_server_time = time_from_frontend.astimezone(my_timezone)
datetime.today()
已经返回本地日期时间(结果与datetime.now()
几乎相同)。 都将本地时间作为天真的日期时间对象返回(避免它们,除非您想立即显示它们)。
获得给定时区当前时间的正确方法是使用datetime.now(tz)
:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # $ pip install tzlocal
local_time = datetime.now(tzlocal.get_localzone())
即使在DST转换期间,当本地时间可能不明确时,它也可以工作(在这种情况下,使用天真的datetime.today()
可能会失败)。
tzlocal
返回一个pytz
tzinfo对象,因此它处理可能在过去有不同UTC时间的时区(在这种情况下,非pytz代码可能会失败)。
你的代码有几个问题:
naive_dt.replace(tzinfo=tz)
,其中tz
具有不固定的utc偏移量。 tz.localize(naive_dt, is_dst=None)
使用tz.localize(naive_dt, is_dst=None)
您的问题中的时间差异表示time_from_frontend
可能以UTC(不是您的本地时区),正如@Brendan Abel所建议的那样。 要将其与当前时间进行比较,如果time_from_frontend
是表示UTC时间的朴素日期时间对象,则可以使用datetime.utcnow()
:
time_diff = datetime.utcnow() - time_from_frontend
要获得可.replace()
时区的日期时间,可以在UTC时区使用.replace()
(utc偏移量是固定的 - 它总是为零),:
frontend_time = time_from_frontend.replace(tzinfo=pytz.utc)
如果两个日期时间对象都是时区感知的,那么减法也起作用:
time_diff = local_time - frontend_time
也可以看看:
上一篇: Python. How to create a local datetime with datetime.today()