ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 날짜 입력 및 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에서도 동일하게 사용해서 참고하시면 좋을 것 같습니다.

    아래의 김유민 선생님의 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://youtu.be/JE9OptIgFlY

     

    https://wikidocs.net/46998

     

    https://devlink.tistory.com/312

     

    https://reakwon.tistory.com/172

     

    댓글

Designed by Tistory.