Python中的时区感知与时区无关。

7

我正在使用Python处理datetime对象。我有一个函数,它接收一个时间并找到该时间与当前时间的差异。

def function(past_time):
    now = datetime.now()
    diff = now - past_time

当我在将past_time传递给该函数之前进行初始化时,我将其初始化为datetime naive。现在它仍然是datetime naive对象。但是当我尝试调用此函数时,我会收到错误消息:无法减去offset-naive和offset-aware日期时间。如果它们都是理论上的datetime naive对象,那么这是怎么回事呢?
任何帮助都将不胜感激。谢谢!

我想也许这个链接可以帮助?https://dev59.com/6G435IYBdhLWcg3wtSYV "使用combine来构建一个 datetime,然后就可以做减法操作了。" - George
请原谅,同时也许我们应该考虑“naive”的定义: (指人或行为)表现出缺乏经验、智慧或判断力。它并不是“aware”的相反。 因此,正确且逻辑上的术语应该是“timezone unaware”。 DateTime、pytz等开发者请在今后更正。 - gseattle
3个回答

14

datetime不进行任何跨时区计算,因为这是一个复杂而涉及广泛的主题。

我建议普遍将日期转换为UTC,并在其中执行数学计算。

我最近完成了一个使用时区的大型Python/Django项目,并在调查后选择将所有内容内部转换为UTC,并仅在向用户显示时进行转换。

你应该研究一下pytz进行与UTC之间的转换,并在你的应用程序中存储所需的时区的Olson代码——也许与每个用户相关联,或适合你的程序。


好的,很好理解。我是 Django 的新手,正在处理日期时间对象... 你能指引我更多关于进行这些转换的信息吗?谢谢! - Mars J
添加了一个关于 pytz 的注释,这是我使用的库。 - nOw2
您是否能够使用这些信息完成您想做的事情?如果可以,您能否点击接受答案呢?谢谢! - nOw2

1

Use :

    now = now.replace(tzinfo=past_time.tzinfo)

之前的差异 = 现在 - 过去时间。

以便现在和过去时间具有相同的时区信息。

仅当现在和过去时间意图处于相同的时区时才是如此。


0
我看到了这篇帖子,想给你一个替代答案(我知道它最初是在2016年发布的!)
我有一个带有UTC时间的对象(在我的情况下是一个RDS快照)。我需要将其与一个无时区的变量进行比较。
我想处理早于days_ago天前的快照,对于提供的current_date,时间为00:01,时区为+00:00。
例如, 如果... current_date是2023-11-08 11:10:04.123456 days_ago是30 我希望cut_off_date是2023-10-11 00:01:00.000000+00:00
以下是步骤:
  1. 创建一个具有UTC意识的变量cut_off_date
  2. 创建一个时区变量utc_tzinfo,其偏移量为0小时
  3. cut_off_date设置为提供的日期减去30天
  4. 将时间设置为00:01
  5. 将时区设置为utc_tzinfo
        # Calculate the cutoff date for deleting backups.
        # this needs to be UTC aware, so has to have a timezone. Which is UTC or +00:00
        utc_offset = datetime.timedelta(hours=0)
        utc_tzinfo = datetime.timezone(utc_offset)

        # create cut off date, for 00:01 in the morning, and timezone of UTC
        cut_off_date = current_date - datetime.timedelta(days=days_ago)
        cut_off_date = cut_off_date.replace(hour=19, minute=1, second=0, microsecond=0)
        cut_off_date = cut_off_date.replace(tzinfo=utc_tzinfo)

        # now you can compare a TZ aware variable with your chosen time


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接