我有这些模型:
class Interval(models.Model):
from_time = models.TimeField(auto_now_add=False)
to_time = models.TimeField(auto_now_add=False)
class CheckIn(models.Model):
date_time = models.DateTimeField(auto_now_add=True)
interval = models.ForeignKey(Interval, on_delete=models.SET_NULL)
主要目标是:
创建a 时CheckIn
,代码应检查它是否在给定的时间间隔内。我需要比较这两者并返回它们的%H:%M:%S
格式差异。
到目前为止我所做的:
CheckIn
由于在保存之前我有不同的场景如何处理给定的内容,因此我正在使用pre_save
信号并且时间比较是这些场景的一部分。这是一个伪:
@receiver(pre_save, sender=CheckIn)
def set_action_state(sender, instance, **kwargs):
if something:
...
if another:
...
else:
...
else:
# instance.date_time.time() is 13:56:56.568860 (2 hours behind, it should be 15 instead of 13)
# instance.interval.from_time is 15:07:40
if instance.date_time.time() < instance.interval.from_time:
# this returns True when it's meant to return False
instance.date_time
是一个时区感知日期,因为我可以打印它tzinfo
返回UTC
而不是 Europe/Sofia
我TIME_ZONE
的设置,我不知道为什么。
所以我手动尝试通过以下方式设置它tz
:
tz = pytz.timezone('Europe/Sofia')
dt1 = instance.date_time.replace(tzinfo=tz)
print(dt1.tzinfo) # which is the correct Europe/Sofia
print(dt1) # which is 13:56:56.568860, again 2 hours behind even with different timezone.
我尝试的第二件事是转换instance.interval.from_time
为有意识的日期时间,然后比较两个日期time()
。
def time_to_datetime(date, time):
return make_aware(datetime.datetime.combine(date, time))
dt2 = time_to_datetime(dt1.date(), instance.interval.from_time)
print(dt2.tzinfo) #this returns 'Europe/Sofia'
print(dt2) #this is 15:07:40
现在两者dt1
都dt2
知道,但比较它们仍然没有运气。这是完整的代码:
tz = pytz.timezone('Europe/Sofia')
dt1 = instance.date_time.replace(tzinfo=tz)
dt2 = time_to_datetime(dt1.date(), instance.interval.from_time)
print(dt1.time() < dt2.time()) # this is True
print(dt1.tzinfo) # 'Europe/Sofia'
print(dt2.tzinfo) # 'Europe/Sofia'
print(dt1.time()) # 13:56:56.568860
print(dt1.time()) # 15:07:40
dt1
即使两个日期时间都知道正确的时区,我如何才能获得正确的时间并使这种比较正常工作?
编辑:我有USE_TZ = True
我的设置。