Python。如何使用 datetime.today() 创建本地日期时间
Posted
技术标签:
【中文标题】Python。如何使用 datetime.today() 创建本地日期时间【英文标题】:Python. How to create a local datetime with datetime.today() 【发布时间】:2016-05-23 01:06:00 【问题描述】:服务器发送我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小时。这是时区差异(“美国/瓜亚基尔”是 GMT-5)。
我有点理解错误。但是我该如何解决呢?有没有办法创建一个与当地时间对应的datetime.today()
对象?
【问题讨论】:
你好像在找pytz - World Timezone Definitions for Python 看看这个,tommikaikkonen.github.io/timezones,也许这会对你有所帮助 相关:Datetime Timezone conversion using pytz 【参考方案1】:我猜你前端的datetime
是UTC。进行替换实际上并不会转换日期时间。它使用数据/小时/等。并且只使用一个新的时区。
当您调用datetime.today()
时,您会创建一个没有任何时区信息的naive 日期时间。当您对此进行 replace
时,它实际上也没有进行转换,它只是假设您提供的日期已经在您提供的时区中,与您在服务器时间所做的替换相同。
要将日期时间转换到另一个时区,您需要使用astimezone
。如果来自服务器的日期时间也是 naive 并且没有指定时区,astimezone
将出错。解决这个问题。首先添加UTC
的时区。
time_from_frontend = time_from_frontend.replace(tzinfo=pytz.timezone('UTC'))
converted_server_time = time_from_frontend.astimezone(my_timezone)
【讨论】:
【参考方案2】:datetime.today()
已经返回本地日期时间(结果与datetime.now()
几乎相同)。两者都将本地时间作为简单的 datetime 对象返回(避免使用它们,除非您想立即显示它们)。
获取给定时区当前时间的正确方法是使用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 代码可能会失败)。
您的代码中有几个问题:
don't usenaive_dt.replace(tzinfo=tz)
where tz
has a non-fixed utc offset. Use tz.localize(naive_dt, is_dst=None)
instead
您问题中的时差表明time_from_frontend
可能在UTC(不是您的本地时区)中为@Brendan Abel suggested。要将其与当前时间进行比较,您可以使用 datetime.utcnow()
如果 time_from_frontend
是代表 UTC 时间的天真日期时间对象:
time_diff = datetime.utcnow() - time_from_frontend
要获取时区感知的日期时间,您可以use .replace()
with UTC timezone (the utc offset is fixed -- it is always zero), :
frontend_time = time_from_frontend.replace(tzinfo=pytz.utc)
如果两个日期时间对象都可以识别时区,那么减法也可以:
time_diff = local_time - frontend_time
另见:
How to get current time in Python Python: How to get a value of datetime.today() that is “timezone aware”?【讨论】:
以上是关于Python。如何使用 datetime.today() 创建本地日期时间的主要内容,如果未能解决你的问题,请参考以下文章