10

我正在通过预定的对象发布来实现功能。用户选择发布时间,我创建了一个每分钟运行一次的 cron 任务并检查是否到了发布时间。

用户来自不同的时区。

所以我需要比较两个日期时间:

>>user_chosen_time
datetime.datetime(2012, 12, 4, 14, 0, tzinfo=tzinfo(120))
>>curdate=datetime.datetime.now()
datetime.datetime(2012, 12, 4, 18, 4, 20, 17340)
>>user_chosen_time==curdate
*** TypeError: can't compare offset-naive and offset-aware datetimes

很抱歉这个相当愚蠢的问题,但我需要讨论这个问题。谢谢

4

2 回答 2

9

正如错误所暗示的那样,您“无法比较原始偏移量和可感知偏移量的日期时间”。这意味着您应该比较两个日期时间,它们都是时区感知或时区天真(不是时区感知)。在您的代码中, curdate 没有时区信息,因此无法与时区感知的 user_chosen_time 进行比较。

首先,您应该为每个日期时间分配正确的时区。然后您可以直接比较具有不同时区的两个日期时间。

示例(使用 pytz):

import pytz
import datetime as dt

# create timezone
nytz=pytz.timezone('America/New_York')
jptz=pytz.timezone('Asia/Tokyo')

# randomly initiate two timestamps
a=dt.datetime(2018,12,13,11,2)
b=dt.datetime(2018,12,13,22,45)

# assign timezone to timestamps
a=nytz.localize(a)
b=jptz.localize(b)

# a = datetime.datetime(2018, 12, 13, 11, 2, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
# b = datetime.datetime(2018, 12, 13, 22, 45, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)

a>b # True
b>a # False

对于其他方法,您可以参考Convert a python UTC datetime to a local datetime using only python standard library?.

于 2018-12-13T16:09:39.760 回答
4

http://pytz.sourceforge.net/是您想要消除时区差异时想要查看的地方:)

编辑:刚刚在 SO 上找到了这篇文章,它可能会为您提供有关您的问题的更多信息

于 2012-12-04T16:16:13.377 回答