-
날짜 입력 및 D-Day 계산Python 2022. 4. 12. 17:30
과제 진행 중에 종료일과 D-Day를 설정해야 해서 찾아봤던 두 가지 방법에 대해 공유하고자 합니다.
1. 문자열을 입력받아 datetime 형식으로 변경 (type이 varchar)
2. 입력받은 값을 바로 date 형식으로 변경 (type이 date)
당연히 2번의 방법이 훨씬 편합니다.
그러나 2번 방법을 시도하다가 에러가 발생해서 1번 방법으로 진행했는데
아무래도 1번 방법이 손이 더 가기에 이번에 정리하고 2번 방식으로 변경해서 진행하고자 합니다.
덕분에 두 가지 방법을 모두 해볼 수 있겠네요. 오히려 좋아!!
1. 문자열로 날짜 입력받는 방법
다음과 같은 형태로 모델과 뷰를 짰습니다.
< models.py >
class Product(TimeStampModel): end_date = models.CharField(max_length=20)
< views.py >
from datetime import datetime class ProductDetailView(View): def get(self, request, product_id): product = Product.objects.select_related('detail', 'publisher').get(pk=product_id) end_date = datetime.strptime(product.end_date, '%Y-%m-%d').date() # 2022-05-10 과 같은 형식이기에 '%Y-%m-%d' 기입.
1. 프론트로부터 전달받은 product_id 값으로 해당 product 객체의 end_date 값을 불러와서
end_date 값과 같은 형식을 써준다. (해당 데이터가 이런 형식이다라고 알려주는 것이다.)
2. strptime - 문자열 타입의 날짜와 시간을 datetime 형식으로 반환
3. date 메서드 사용하여 시간 제외한 날짜 형식의 데이터 반환
strftime - datetime 타입의 날짜와 시간을 문자열로 반환
당연하지만 <class 'datetime.datetime'> 와 <class 'datetime.date'> 는 데이터의 타입이 다르므로
이 상태로는 연산이 불가능합니다. 그래서 저는 날짜만 필요하기에 위의 3번 방식을 사용하여 연산할 수 있었습니다.
# D-Day 구하기
위에서 설정한 end_date에서 오늘 날짜를 빼서 남아있는 날을 구하면 된다.
today = datetime.now().date() print(type(today), today) # <class 'datetime.date'> 2022-04-12 d_day = end_date - today print(type(d_day), d_day) # <class 'datetime.timedelta'> 28 days, 0:00:00 # 날짜만 필요하기에 아래처럼 작성 result = (end_date - today).days print(type(result), result) # <class 'int'> 28 print(str(result) + '일') # 28일
풀어쓰다 보니 설명도 길어지고 복잡한 듯 보이지만 다 정리된 것을 보시면 보다 쉬울 겁니다.
from datetime import datetime class ProductDetailView(View): def get(self, request, product_id): product = Product.objects.select_related('detail', 'publisher').get(pk=product_id) end_date = datetime.strptime(product.end_date, '%Y-%m-%d').date() data = { 'd-day': str((end_date - datetime.now().date()).days) + '일', }
그리고 DATE 표기법은 SQL에서도 동일하게 사용해서 참고하시면 좋을 것 같습니다.
2. DATE
< models.py >
class Product(TimeStampModel): end_date = models.DateField()
< views.py >
from datetime import datetime class ProductDetailView(View): def get(self, request, product_id): product = Product.objects.select_related('detail', 'publisher').get(pk=product_id) data = { 'd-day': str((product.end_date - datetime.now().date()).days) + '일', }
1번의 CharField를 사용하는 것보다 훨씬 간단하게 D-Day를 해결할 수 있었습니다.
날짜 값은 '2022-10-01' 과 같은 형식으로 입력되는 것으로 진행했습니다.
< 참고 자료 >
SQL 이론과 실습 관련 영상 찾으시면 아래의 영상을 추천드립니다.
https://devlink.tistory.com/312
https://reakwon.tistory.com/172
'Python' 카테고리의 다른 글
함수(function)와 1급 객체(first-class citizen) (0) 2022.05.23 python 내장함수 getattr (0) 2022.05.19 Python shell - help 기능 (0) 2022.01.16 list comprehension 중복 제거 - Object of type set is not JSON serializable (0) 2022.01.16 UUID vs CharField의 max_length (0) 2022.01.02