본문 바로가기
코딩 연습/코딩배우기

[python] 파이썬 datetime() 함수로 살아온 연월일 계산하기(코딩 연습)

by good4me 2020. 9. 23.

goodthings4me.tistory.com

 

■ main() 함수에 태어난 연월일을 인자로 넣으면 현재까지 살아온 총 일수와 연월일을 계산해주는 프로그램 코딩 연습(파이썬 초보자의 datetime() 함수 활용)

from datetime import datetime

class PeriodFromBirth:
    month_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) # 월(1~12)별 일수
    
    def __init__(self, year, month, day):
        self.set_prd_birthday(year, month, day)
    
    def get_prd_birthday(self): # 생년월일에서 현재까지의 기간 등
        print('당신은 태어나서 오늘까지 {0:,}일({1}년 {2}개월 {3}일)을 살았습니다.'\
        .format(self.tday.days, self.years, self.month_cnt, self.days))
        return [self.tday, self.years, self.month_cnt, self.days]
        
    def set_prd_birthday(self, year, month, day):
        self.ubirthday = datetime(year, month, day)
        self.now = datetime.now()
        self.tday = self.now - self.ubirthday  # 총 일수
        # self.tday는 <class 'datetime.timedelta'>
 
        self.leap_years = [n for n in range(self.ubirthday.year, self.now.year + 1) if n % 4 == 0 ]
        # 태어난 해부터 현재까지의 윤년 리스트

        self.years = (self.tday.days - len(self.leap_years)) // 365  # 지난 총 연(年)수
        self.days = (self.tday.days - len(self.leap_years)) % 365
        # 연(年)수 제외한 올해 일수(단, 윤년 일수 제외)   

        self.month_cnt = 0  # 올 해의 지난 월수
        
        if self.ubirthday.month <= self.now.month and self.ubirthday.day <= self.now.day:
            for i in range(self.ubirthday.month + 1, self.now.month): 
                if self.days - PeriodFromBirth.month_days[i-1] >= 0:
                    self.month_cnt += 1  # 지난 월수 누적
                    self.days -= PeriodFromBirth.month_days[i-1]
                else:
                    break
            self.days_left()
                
        else:
            for i in range(self.ubirthday.month + 1, 13): # 생년의 월 다음 월부터 12월말까지
                if self.days - PeriodFromBirth.month_days[i-1] >= 0:
                    self.month_cnt += 1
                    self.days -= PeriodFromBirth.month_days[i-1]
                else:
                    break
            for i in range(1, self.now.month):  # 1월부터 현재 월의 전월까지
                if self.days - PeriodFromBirth.month_days[i-1] >= 0:
                    self.month_cnt += 1
                    self.days -= PeriodFromBirth.month_days[i-1]
                else:
                    break
            self.days_left()

    def days_left(self): # 남은 전체 일수를 월과 일로 구분하여 각각 계산
        if self.days >= PeriodFromBirth.month_days[self.ubirthday.month-1]:
            self.m, self.d = divmod(self.days, PeriodFromBirth.month_days[self.ubirthday\
            .month-1])
            self.month_cnt += self.m
            self.days = self.d
                      

    def __str__(self):
        return '당신은 태어나서 오늘까지 {0:,}일({1}년 {2}개월 {3}일)을 살았습니다.'\
        .format(self.tday.days, self.years, self.month_cnt, self.days)
    
    
def main():
    pb = PeriodFromBirth(2000, 3, 14)
    #print(pb)
    tdelta = pb.get_prd_birthday()


main()

good4me.co.kr

 

[실행 결과]

당신은 태어나서 오늘까지 7,498일(20년 6개월 8일)을 살았습니다.

 

 

댓글