python 無法比較天真和意識到datetime.now()<= challenge.datetime_end



django comparison (4)

datetime.datetime.now不是時區感知的。

Django為此提供了一個幫手,需要pytz

from django.utils import timezone
now = timezone.now()

now應該能夠與challenge.datetime_start進行比較

我試圖使用比較運算符將當前日期和時間與模型中指定的日期和時間進行比較:

if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:

腳本錯誤:

TypeError: can't compare offset-naive and offset-aware datetimes

模型看起來像這樣:

class Fundraising_Challenge(models.Model):
    name = models.CharField(max_length=100)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()

我也有使用語言環境日期和時間的django。

我無法找到的是django用於DateTimeField()的格式。 是天真還是意識到? 如何讓datetime.now()識別語言環境日期時間?


Answer #1

一行代碼解決方案

if timezone_aware_var <= datetime.datetime.now(timezone_aware_var.tzinfo):
    pass #some code

解釋版本:

# Timezone info of your timezone aware variable
timezone = your_timezone_aware_variable.tzinfo

# Current datetime for the timezone of your variable
now_in_timezone = datetime.datetime.now(timezone)

# Now you can do a fair comparison, both datetime variables have the same time zone
if your_timezone_aware_variable <= now_in_timezone:
    pass #some code

概要:
您必須將時區信息添加到now()日期時間。
但是,您必須添加引用變量的相同時區; 這就是我第一次閱讀tzinfo屬性的原因。


Answer #2

默認情況下, datetime像在Python中是naive的,因此您需要使它們都是天真的或有意識的datetime對象。 這可以使用:

import datetime
import pytz

utc=pytz.UTC

challenge.datetime_start = utc.localize(challenge.datetime_start) 
challenge.datetime_end = utc.localize(challenge.datetime_end) 
# now both the datetime objects are aware, and you can compare them

注意:如果已設置tzinfo則會引發ValueError 。 如果您不確定,請使用

start_time = challenge.datetime_start.replace(tzinfo=utc)
end_time = challenge.datetime_end.replace(tzinfo=utc)

順便說一句,您可以使用時區信息格式化datetime.datetime對像中的UNIX時間戳,如下所示

d = datetime.datetime.utcfromtimestamp(int(unix_timestamp))
d_with_tz = datetime.datetime(
    year=d.year,
    month=d.month,
    day=d.day,
    hour=d.hour,
    minute=d.minute,
    second=d.second,
    tzinfo=pytz.UTC)

Answer #3

所以我解決這個問題的方法是確保兩個日期時間在正確的時區。

我可以看到你正在使用datetime.now() ,它將返回系統當前時間,沒有設置tzinfo。

tzinfo是附加到日期時間的信息,讓它知道它所在的時區。如果你使用的是天真的日期時間,你需要在整個系統中保持一致。 我強烈建議只使用datetime.utcnow()

看到你正在創建具有與之關聯的tzinfo的日期時間,你需要做的是確保它們已經本地化(與tzinfo相關聯)到正確的時區。

看看Delorean ,它可以更輕鬆地處理這類事情。





comparison