순진하고 인식하는 datetime.now () <= challenge.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()
또한 로케일 날짜와 시간을 사용하는 장고가 있습니다.
내가 찾을 수 없었던 것은 django가 DateTimeField ()에 사용하는 형식입니다. 순진하거나 알고 있습니까? 로케일 날짜 시간을 인식하기 위해 datetime.now ()를 어떻게 얻습니까?
기본적으로 datetime
객체는 naive
Python에 있으므로 두 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
if tzinfo
가 이미 설정되어 있습니다. 확실하지 않은 경우 다음을 사용하십시오.
start_time = challenge.datetime_start.replace(tzinfo=utc)
end_time = challenge.datetime_end.replace(tzinfo=utc)
BTW, 다음과 같이 시간대 정보를 사용하여 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
시간대를 인식하지 못합니다.
Django는이를 위해 도우미를 제공합니다. 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.now()
tzinfo가 설정되지 않은 상태에서 시스템의 현재 시간을 반환하는 것을 사용 하고 있음을 알 수 있습니다 .
tzinfo is the information attached to a datetime to let it know what timezone it is in. If you are using naive datetime you need to be consistent through out your system. I would highly recommend only using datetime.utcnow()
seeing as somewhere your are creating datetime that have tzinfo associated with them, what you need to do is make sure those are localized (has tzinfo associated) to the correct timezone.
Take a look at Delorean, it makes dealing with this sort of thing much easier.
It is working form me. Here I am geeting the table created datetime and adding 10 minutes on the datetime. later depending on the current time, Expiry Operations are done.
from datetime import datetime, time, timedelta
import pytz
Added 10 minutes on database datetime
table_datetime = '2019-06-13 07:49:02.832969' (example)
# 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 ")
It worked for me.
'development' 카테고리의 다른 글
Asp.net MVC ModelState.Clear (0) | 2020.07.24 |
---|---|
Eclipse : log4j.xml에서 log4j.dtd 참조 (0) | 2020.07.24 |
Jquery에서 모든 Click 이벤트 핸들러를 제거하는 방법 (0) | 2020.07.24 |
과도한 요소를 제거하는 고정 크기의 큐가 있습니까? (0) | 2020.07.24 |
angular.js ng-model에 json을로드하는 방법은 무엇입니까? (0) | 2020.07.24 |