蟒蛇。 如何使用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中获取当前时间
  • Python:如何获得datetime.today()的值是“时区感知”?
  • 链接地址: http://www.djcxy.com/p/40925.html

    上一篇: Python. How to create a local datetime with datetime.today()

    下一篇: calculate difference between two time in hour