249

比較演算子を使用して、現在の日付と時刻をモデルで指定された日付と時刻と比較しようとしています。

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() にロケールの日時を認識させるにはどうすればよいですか?

4

9 に答える 9

229

デフォルトでは、datetimeオブジェクトはnaivePython にあるため、両方をナイーブ オブジェクトまたは認識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

注: これは、既に設定されているValueError場合に発生します。tzinfoそれについてよくわからない場合は、そのまま使用してください

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)
于 2013-03-09T05:54:15.763 に答える
134

datetime.datetime.nowタイムゾーンを認識していません。

Djangoにはこのためのヘルパーが付属しています。pytz

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

nowあなたはと比較することができるはずですchallenge.datetime_start

于 2013-03-09T09:59:53.613 に答える
92

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

于 2015-10-03T18:57:18.383 に答える
3

それは私から働いています。ここでは、datetime で作成されたテーブルを取得し、datetime に 10 分を追加しています。後で現在の時刻に応じて、有効期限操作が行われます。

from datetime import datetime, time, timedelta
import pytz

データベース日時に 10 分追加

table_datetime = '2019-06-13 07:49:02.832969' (例)

# Added 10 minutes on database datetime
# table_datetime = '2019-06-13 07:49:02.832969' (example)

table_expire_datetime = table_datetime + timedelta(minutes=10 )

# Current datetime
current_datetime = datetime.now()


# replace the timezone in both time
expired_on = table_expire_datetime.replace(tzinfo=utc)
checked_on = current_datetime.replace(tzinfo=utc)


if expired_on < checked_on:
    print("Time Crossed)
else:
    print("Time not crossed ")

それは私のために働いた。

于 2019-08-01T10:02:02.350 に答える
2

したがって、この問題を解決する方法は、2 つの日時が正しいタイムゾーンにあることを確認することです。

datetime.now()tzinfo を設定せずに、システムの現在の時刻を返す which を使用していることがわかります。

tzinfo は、datetime に添付されて、現在のタイムゾーンを知らせる情報です。単純な datetime を使用している場合は、システム全体で一貫性を保つ必要があります。のみを使用することを強くお勧めしますdatetime.utcnow()

どこかで tzinfo が関連付けられた datetime を作成しているように見える場合、それらが正しいタイムゾーンにローカライズされている (tzinfo が関連付けられている) ことを確認する必要があります。

Deloreanを見てみましょう。この種の処理がはるかに簡単になります。

于 2013-03-10T00:44:58.377 に答える