it-source

Naigent datetime.now()와 인식 datetime_end를 비교할 수 없습니다.

criticalcode 2022. 12. 9. 21:49
반응형

Naigent datetime.now()와 인식 datetime_end를 비교할 수 없습니다.

비교 연산자를 사용하여 현재 날짜와 시간을 모델에 지정된 날짜와 시간으로 비교하려고 합니다.

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()

저는 또 현지 날짜와 시간을 사용한 장고를 먹습니다.

Date Time Field()에 대해 django가 사용하는 포맷을 찾을 수 없었습니다.순진해? 아니면 의식해?datetime.now()가 local datetime을 인식하려면 어떻게 해야 하나요?

디폴트로는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)

datetime.datetime.now는 타임존을 인식하지 않습니다.

장고는 이것을 위해 도우미와 함께 오는데, 이것은 필수입니다.pytz

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

비교가 가능해야 합니다.now로.challenge.datetime_start

한 줄의 코드 솔루션

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기여하다.

타임 존을 디세블로 합니다.사용하다challenge.datetime_start.replace(tzinfo=None);

를 사용할 수도 있습니다.replace(tzinfo=None)다른 날짜의 경우.

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

서드파티는 없고 네이티브 datetime 모듈만 있습니다.

from datetime import datetime, timedelta, timezone

time1 = datetime.strptime('2021-07-15T00:22:02+0000', '%Y-%m-%dT%H:%M:%S%z')
time2 = datetime(2021, 7, 15, tzinfo=timezone(offset=timedelta()))
if time1 < time2:
    print(True)

그것은 나에게 효과가 있다.여기에서는 작성한 datetime 테이블을 geeting하고 datetime에 10분을 추가합니다.나중에 현재 시간에 따라 Expiry Operations가 수행됩니다.

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 ")

그것은 나에게 효과가 있었다.

따라서 이 문제를 해결하는 방법은 두 개의 데이터 시간이 올바른 시간대에 있는지 확인하는 것입니다.

사용하고 있는 것을 알 수 있습니다.datetime.now()tzinfo를 설정하지 않고 시스템의 현재 시간을 반환합니다.

tzinfo는 어떤 시간대에 있는지 알리기 위해 datetime에 부가된 정보입니다.순진한 날짜/시간을 사용하는 경우 시스템 전체에서 일관성을 유지해야 합니다.저는 이 기능을 사용하는 것을 강력히 추천합니다.datetime.utcnow()

tzinfo가 관련지어져 있는 datetime이 작성되고 있는 것을 알 수 있기 때문에, 이러한 datetime이 올바른 타임 존에 현지화되어 있는지(tzinfo가 관련지어져 있는지) 확인할 필요가 있습니다.

들로리언을 보면 이런 일을 훨씬 쉽게 처리할 수 있어

날짜 시간replace ★★★★★★★★★★★★★★★★★」astimezone★★★★★★★★★★★★★★★★★★.

local_tz = pytz.timezone('Asia/Kolkata')

current_time = datetime.now().replace(tzinfo=pytz.utc).astimezone(local_tz)

그냥:

dt = datetimeObject.strftime(format) # format = your datetime format ex) '%Y %d %m'
dt = datetime.datetime.strptime(dt,format)

다음 작업을 수행합니다.

start_time = challenge.datetime_start.strftime('%Y %d %m %H %M %S')
start_time = datetime.datetime.strptime(start_time,'%Y %d %m %H %M %S')

end_time = challenge.datetime_end.strftime('%Y %d %m %H %M %S')
end_time = datetime.datetime.strptime(end_time,'%Y %d %m %H %M %S')

에 런음음음 and를 사용하다start_time ★★★★★★★★★★★★★★★★★」end_time

언급URL : https://stackoverflow.com/questions/15307623/cant-compare-naive-and-aware-datetime-now-challenge-datetime-end

반응형