파이썬으로 만나이를 계산해보자

아니 이게요… 일하는데 어떤 분이 엑셀로 생년월일 입력하면 만나이 계산 알아서 되는 방법이 있다던데 함수좀 짜달라길래… 속으로 오 씨 콘텐츠 각 이러면서 짰습니다… 이걸 각을 재네 나중에 JS랑 엑셀로도 할거고 하게 되면 또 올리겠음. 참고로 엑셀은 미디움에는 안 올라갑니다. 원래 미디움에는 잔머리엑셀 연재 안했음.


일단 만 나이가 뭐냐… 한국인은 나이가 두 개인데 첫번째가 해가 지나가면(1월 1일 되면) +1씩 더해지는 세는 나이고 두번째가 본인 생일이 지나야 올라가는 만나이이다. 보통 사람들하고 교류할때는 세는 나이를 말하고 행정 처리(예를 들자면 교통카드 요금이 청소년->성인으로 올라가는 것) 할 때는 만 나이로 들어가는데, 본인은 91년생이기때문에 세는 나이로는 34살이지만 아직 생일이 안 지나서 만 나이는 32살이다. 근데 두달후면 올라서 의미는 엄숴… 아무튼 만 나이는 생일이 지났다면 세는 나이에서 -1이고 안 지났으면 세는 나이에서 -2 하면 된다.

from datetime import datetime

birth = input('생일을 yyyy-mm-dd형식으로 입력해주세요: ')

datetime이 있으면 파이썬에서도 날짜와 시간을 주물주물 할 수 있다. 아무튼 그래서 일단 불러오고… 생일 입력 받고… 아니 생일을 입력받아야 나이 계산을 할 거 아뉴.

birthday = datetime.strptime(birth,"%Y-%m-%d")

now_year = datetime.today().year
now_month = datetime.today().month
now_day = datetime.today().day
# 오늘 년월일

birth_year = birthday.year
birth_month = birthday.month
birth_day = birthday.day
# 생일 년월일

일단 생일은 문자열 형태라 저거 자체로는 계산을 못 하기 때문에 strptime을 이용해서 날짜로 바꿔줄거다. 보통 태어난 시까지는 잘 모르기도 하고 사주 볼 때나 쓰기때문에 의미는 없고 걍 연월일 하면 되는데 4자리 할거면 y는 반드시 대문자로 해야 한다. 내 경험담임. 소문자 하니께 에러떴음…… 위는 현재 연월일, 아래는 생일에서 추출한 연월일이다.

isbirthdaypass = False
# 음 대충 생일 플래그인걸로 합시다

if birth_month < now_month : # 생일 월보다 현재 날짜의 월이 더 크면 생일이 지난것이므로
isbirthdaypass = True # 만나이 +1
elif birth_month == now_month: # 생일 월과 현재 월이 같다면
if birth_day <= now_day : # 현재 일이 생일보다 크거나 같나요?
isbirthdaypass = True # 응 만나이 먹었어
else: # 아니야?
isbirthdaypass = False # 응 아직 아니야
else:
isbirthdaypass = False # 생일 월이 현재 날짜보다 크다면 아직 안 지난 것

위에 있는 불린은 대충 플래그니까 패스하시고… 여기가 제일 골대리는 파트니까 집중하십쇼.

자 일단 만 나이가 올라가는 기준이 생일이라고 했잖아요? 그럼 생일이 지났는지를 어떻게 판별하느냐…

  1. 생일 월 < 현재 월: 생일 지났다.
  2. 생일 월 > 현재 월: 아직 아니다.
  3. (여기가 분기점) 생일 월이랑 현재 월이 같은가? -> 현재 일이 생일보다 크거나 같나요? 예: 지났음/아니오: 응 아직

3번이 제일 이해가 안 갈텐데 생각해보자. 오늘이 1월 9일이니까 91년 1월 8일생인 사람이 있다면 월은 1로 둘 다 같으니까 일을 비교할것이다. 그럼 birth_day는 8이고 now_day는 9니까 오른쪽이 더 크잖음? 그래서 만으로 33세가 되는거다. 반면 91년 1월 10일생인 사람은 오늘이 1월 9일이라 birth_day가 now_day보다 크기때문에(현재 일이 생일보다 작기때문에) 아직 만 나이가 오르지 않았는데… 아… 곧 오르네…

if isbirthdaypass == False:
print(now_year - birth_year - 1)
else:
print(now_year - birth_year)

플래그가 섰다면 플래그대로 출력하면 된다. 일단 생일이 아직 안 지났으면 만나이가 아직 안 오른건 다들 아실테니 패스하고 계산이 왜 저런지를 설명하자면, 원래 만나이가 현재 년도에서 태어난 년도 뺀 게 만나이다. 년도’만’ 빼면 그런데 아직 만나이가 안 올랐으면 거기서 1을 더 빼면 된다.

참고로 외국에서는 만 나이만 사용하니 이 점 유의합시다. 당장 옆나라 일본도 만나이로 센다.