蟒蛇。 如何使用datetime.today()创建本地日期时间

Python. How to create a local datetime with datetime.today()

服务器发送一个字符串I striptime并保存在一个名为time_from_frontend的变量中,然后像这样添加一个tzinfo:

1
2
3
4
5
6
7
8
9
10
11
12
13
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之间会有很大差异? 这是终端打印的内容:

1
2
3
4
5
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"是GMT-5)。

我有点理解这个错误。 但是我该如何解决呢? 有没有办法创建一个对应于本地时间的datetime.today()对象?


我猜你的前端的datetime是UTC。执行替换实际上并不转换日期时间。它使用数据/小时/等。并只使用一个新的时区。

当您调用datetime.today()时,您将创建一个没有任何时区信息的天真日期时间。当你对它进行replace时,它实际上也没有进行转换,它只是假设你给它的日期已经在你提供的时区,就像你在服务器时间做的替换一样。

要将日期时间实际转换为另一个时区,您需要使用astimezone。如果服务器的日期时间也很幼稚且未指定时区,则astimezone将出错。解决这个问题。首先添加UTC的时区。

1
2
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)

1
2
3
4
5
#!/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)
  • 您的问题中的时差表明time_from_frontend可能是UTC(不是您当地的时区),正如@Brendan Abel建议的那样。要将其与当前时间进行比较,如果time_from_frontend是表示UTC时间的天真日期时间对象,则可以使用datetime.utcnow()

    1
    time_diff = datetime.utcnow() - time_from_frontend

    要获得时区感知日期时间,可以将.replace()与UTC时区一起使用(utc偏移量是固定的 - 它始终为零),:

    1
    frontend_time = time_from_frontend.replace(tzinfo=pytz.utc)

    如果两个datetime对象都是时区感知的,那么减法也可以:

    1
    time_diff = local_time - frontend_time

也可以看看:

  • 如何在Python中获取当前时间
  • Python:如何获得"timezone aware"的datetime.today()值?