Python에서 날짜 유효성 검사를 수행하는 방법은 처리하려는 날짜의 형식에 따라 크게 달라집니다. datetime 라이브러리의 strptime() 함수를 사용하면 문자열을 날짜/시간 객체로 손쉽게 변환할 수 있으며, 지정한 형식과 맞지 않는 문자열이 들어오면 ValueError가 발생하기 때문에 이를 활용해 유효성 검사를 구현할 수 있습니다.
기본 예제
import datetime
date_string = '2017-12-31'
date_format = '%Y-%m-%d'
try:
date_obj = datetime.datetime.strptime(date_string, date_format)
print(date_obj)
except ValueError:
print("잘못된 날짜 형식입니다. YYYY-MM-DD 형식이어야 합니다.")
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
2017-12-31 00:00:00
날짜 문자열이 %Y-%m-%d 형식에 부합하므로 정상적으로 파싱되어 출력됩니다. 만약 '2017-13-31'처럼 존재하지 않는 날짜나 잘못된 형식의 문자열이 입력되면 ValueError가 발생하고, except 블록의 오류 메시지가 출력됩니다.
strptime()에서 지원하는 포맷 지시자
strptime()은 다양한 지시자(directive)를 조합하여 여러 형식의 날짜와 시간을 파싱할 수 있습니다. 아래 표는 자주 사용되는 주요 지시자와 그 의미를 정리한 것입니다.
| 지시자 | 의미 |
| %a | 로케일 기준 축약된 요일 이름 |
| %A | 로케일 기준 전체 요일 이름 |
| %b | 로케일 기준 축약된 월 이름 |
| %B | 로케일 기준 전체 월 이름 |
| %c | 로케일에 적합한 날짜 및 시간 표현 |
| %d | 일(day)을 10진수로 표시 [01~31] |
| %H | 시간(24시간제)을 10진수로 표시 [00~23] |
| %I | 시간(12시간제)을 10진수로 표시 [01~12] |
| %j | 연중 몇 번째 날인지 10진수로 표시 [001~366] |
| %m | 월을 10진수로 표시 [01~12] |
| %M | 분을 10진수로 표시 [00~59] |
| %p | 로케일 기준 AM 또는 PM 표시 |
| %S | 초를 10진수로 표시 [00~61] |
| %U | 연중 몇 번째 주인지 10진수로 표시 [00~53] (일요일을 한 주의 시작으로 간주하며, 새해 첫 번째 일요일 이전의 날들은 0주로 계산) |
| %w | 요일을 10진수로 표시 [0(일요일)~6] |
| %W | 연중 몇 번째 주인지 10진수로 표시 [00~53] (월요일을 한 주의 시작으로 간주하며, 새해 첫 번째 월요일 이전의 날들은 0주로 계산) |
| %x | 로케일에 적합한 날짜 표현 |
| %X | 로케일에 적합한 시간 표현 |
| %y | 세기(year century)를 제외한 연도를 10진수로 표시 [00~99] |
| %Y | 세기를 포함한 연도를 10진수로 표시 |
| %Z | 시간대(time zone) 이름 (시간대 정보가 없으면 빈 문자열) |
| %% | 리터럴 '%' 문자 그대로 표시 |
마무리
이처럼 strptime() 함수와 try-except 문을 조합하면 별도의 외부 라이브러리 없이도 간단하고 확실하게 날짜 유효성 검사를 수행할 수 있습니다. 입력받는 날짜 형식에 맞는 지시자를 지정해 주는 것이 핵심입니다.