[Python] 날짜/시간 포맷팅 완벽 가이드: strftimec으로 연월일 시분초 출력
파이썬에서 날짜와 시간 데이터를 다루는 것은 매우 흔한 작업입니다. 이 데이터를 사용자에게 보여주거나 파일에 저장할 때, 사람이 읽기 쉬운 형태로 만드는 것이 중요합니다. datetime
모듈은 이러한 날짜 및 시간 데이터를 원하는 형식의 문자열로 변환하거나, 특정 형식의 문자열로부터 날짜/시간 객체를 생성하는 강력한 기능을 제공합니다.
이번 포스트에서는 datetime
객체를 활용하여 날짜와 시간을 다양한 포맷으로 출력하는 방법, 특히 strftime()
메소드와 포맷 코드에 대해 자세히 알아보겠습니다.
1. 날짜/시간 포맷팅의 핵심: strftime()
strftime()
메소드는 date
, time
, datetime
객체가 가지고 있는 내장 메소드로, 이 객체들이 가진 날짜/시간 정보를 지정된 "포맷 코드"에 따라 문자열로 변환해줍니다.
- 사용법:
datetime_객체.strftime("포맷_코드_문자열")
포맷 코드의 특징:
포맷 코드는 일반적으로 "%알파벳"
형태로 구성됩니다.
%알파벳
: 대부분 고정된 길이로 출력되며, 자릿수가 부족할 경우 앞에0
을 채웁니다 (예: 2월 ->02
, 7일 ->07
).%-알파벳
(일부 플랫폼/코드):0
과 같은 패딩 없이 숫자를 그대로 출력합니다 (예: 2월 ->2
, 7일 ->7
). (주의:%-
접두사는 모든 포맷 코드나 모든 운영체제에서 동일하게 지원되지 않을 수 있습니다.)
2. 문자열에서 날짜/시간 객체로: strptime()
반대로, 일정한 형식으로 작성된 날짜/시간 문자열을 파싱(parsing)하여 datetime
객체로 변환하고 싶을 때는 datetime.strptime()
클래스 메소드를 사용합니다. 여기서 p
는 "parse"를 의미합니다.
- 사용법:
datetime.strptime("날짜_문자열", "포맷_코드_문자열")
- 예시:
import datetime date_string = "2023-10-26T15:45:30" dt_object = datetime.datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S") print(dt_object) # 출력: 2023-10-26 15:45:30
3. 주요 포맷 코드 실습
먼저 실습에 사용할 datetime
모듈을 가져옵니다. 예제에서는 여러 포맷 코드의 결과를 한눈에 비교하기 위해 |
기호를 구분자로 사용하겠습니다.
import datetime
# 실습용 기준 날짜 및 시간 객체 생성
sample_date = datetime.date(2023, 5, 8)
sample_datetime = datetime.datetime(2023, 5, 8, 14, 30, 5, 123456)
3.1. 연도(Year) 관련 포맷
# 연도
print(f"연도: {sample_date.strftime('%y | %Y')}")
#// 결과 : 연도: 23 | 2023
#// %y : 세기를 제외한 연도 (00-99), 0으로 채움
#// %Y : 세기를 포함한 4자리 연도
3.2. 월(Month) 관련 포맷
# 월
print(f"월: {sample_date.strftime('%m | %-m | %b | %B')}")
#// 결과 (로케일 설정에 따라 다를 수 있음, 예: 영어 로케일): 월: 05 | 5 | May | May
#// %m : 0으로 채워진 2자리 숫자 월 (01-12)
#// %-m : 0 채움 없는 숫자 월 (1-12) (플랫폼/코드 의존적)
#// %b : 현재 로케일의 축약된 월 이름 (예: Jan, Feb)
#// %B : 현재 로케일의 전체 월 이름 (예: January, February)
3.3. 일(Day) 관련 포맷
# 일
print(f"일: {sample_date.strftime('%d | %-d')}")
#// 결과 : 일: 08 | 8
#// %d : 0으로 채워진 2자리 숫자 일 (01-31)
#// %-d : 0 채움 없는 숫자 일 (1-31) (플랫폼/코드 의존적)
3.4. 요일(Weekday) 관련 포맷
# 요일
print(f"요일: {sample_date.strftime('%a | %A | %w')}")
#// 결과 (로케일 설정에 따라 다를 수 있음, 예: 영어 로케일): 요일: Mon | Monday | 1
#// %a : 현재 로케일의 축약된 요일 이름 (예: Mon, Tue)
#// %A : 현재 로케일의 전체 요일 이름 (예: Monday, Tuesday)
#// %w : 숫자로 표현된 요일 (0: 일요일, 1: 월요일, ..., 6: 토요일)
3.5. 시간(Hour) 관련 포맷
# 시
print(f"시: {sample_datetime.strftime('%H | %-H | %I | %-I | %p')}")
#// 결과 (로케일 설정에 따라 다를 수 있음, 예: 영어 로케일): 시: 14 | 14 | 02 | 2 | PM
#// %H : 0으로 채워진 24시간 형식 시 (00-23)
#// %-H : 0 채움 없는 24시간 형식 시 (0-23) (플랫폼/코드 의존적)
#// %I : 0으로 채워진 12시간 형식 시 (01-12)
#// %-I : 0 채움 없는 12시간 형식 시 (1-12) (플랫폼/코드 의존적)
#// %p : 현재 로케일의 AM 또는 PM 표시
3.6. 분(Minute) 및 초(Second) 관련 포맷
# 분
print(f"분: {sample_datetime.strftime('%M | %-M')}")
#// 결과 : 분: 30 | 30
#// %M : 0으로 채워진 2자리 숫자 분 (00-59)
#// %-M : 0 채움 없는 숫자 분 (0-59) (플랫폼/코드 의존적)
# 초 및 마이크로초
print(f"초: {sample_datetime.strftime('%S | %-S | %f')}")
#// 결과 : 초: 05 | 5 | 123456
#// %S : 0으로 채워진 2자리 숫자 초 (00-59)
#// %-S : 0 채움 없는 숫자 초 (0-59) (플랫폼/코드 의존적)
#// %f : 마이크로초 (000000-999999)
3.7. 기타 유용한 포맷
# 기타 (연중 일차, 연중 주차)
sample_date_other = datetime.date(2023, 1, 10) # 다른 예시 날짜
print(f"기타: {sample_date_other.strftime('%j | %-j | %U | %W')}")
#// 결과 : 기타: 010 | 10 | 02 | 01
#// %j : 0으로 채워진 연중 일차 (001-366)
#// %-j : 0 채움 없는 연중 일차 (1-366) (플랫폼/코드 의존적)
#// %U : 연중 주차 (일요일을 주의 시작으로 간주, 00-53)
#// %W : 연중 주차 (월요일을 주의 시작으로 간주, 00-53)
4. 시간대(Timezone) 정보 포맷팅
시간대 정보를 포함하는 datetime
객체 (aware object)의 경우, 시간대 관련 포맷 코드도 사용할 수 있습니다.
KST = datetime.timezone(datetime.timedelta(hours=+9), name="KST")
aware_datetime = datetime.datetime(2023, 5, 8, 14, 30, 5, tzinfo=KST)
print(f"시간대: {aware_datetime.strftime('%z | %Z')}")
#// 결과 : 시간대: +0900 | KST
#// %z : UTC 오프셋 (+HHMM 또는 -HHMM 형식, naive 객체는 빈 문자열)
#// %Z : 시간대 이름 (naive 객체는 빈 문자열)
5. ISO 8601 표준 형식 출력
국제 표준인 ISO 8601 형식으로 날짜와 시간을 출력하는 것은 데이터 교환 시 매우 유용합니다. strftime
을 조합하여 만들 수도 있지만, datetime
객체는 isoformat()
이라는 편리한 메소드를 제공합니다.
# strftime 사용 (시간대 오프셋 콜론(:) 수동 추가)
temp_iso_strftime = aware_datetime.strftime("%Y-%m-%dT%H:%M:%S%z")
if len(temp_iso_strftime) > 22 and temp_iso_strftime[-5] in ('+', '-'): # +HHMM 형태인지 확인
iso_with_colon_strftime = temp_iso_strftime[:-2] + ":" + temp_iso_strftime[-2:]
print(f"strftime ISO: {iso_with_colon_strftime}")
#// 결과: strftime ISO: 2023-05-08T14:30:05+09:00
# isoformat() 메소드 사용 (권장)
# 마이크로초를 제외하고 싶다면 microsecond=0으로 설정
iso_datetime = aware_datetime.replace(microsecond=0).isoformat()
print(f"isoformat(): {iso_datetime}")
#// 결과 : isoformat(): 2023-05-08T14:30:05+09:00
# naive datetime 객체 (시간대 정보 없는)의 isoformat
naive_datetime = datetime.datetime(2023, 5, 8, 14, 30, 5)
print(f"naive isoformat(): {naive_datetime.isoformat()}")
#// 결과: naive isoformat(): 2023-05-08T14:30:05
isoformat()
은 시간대 정보가 있는 객체에 대해서는 UTC 오프셋을 자동으로 올바른 형식으로 포함시켜 줍니다.
6. 마무리
파이썬의 datetime
모듈과 strftime()
메소드를 사용하면 날짜와 시간 데이터를 매우 유연하게 원하는 문자열 형태로 표현할 수 있습니다. 다양한 포맷 코드를 조합하여 애플리케이션의 요구사항에 맞는 출력 형식을 만들어보세요. 더 많은 포맷 코드와 상세한 내용은 아래 공식 문서를 참고하시는 것이 좋습니다.
참고 자료
- Python 공식 문서 (datetime): https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
이 글이 파이썬으로 날짜와 시간 데이터를 다루는 데 도움이 되셨기를 바랍니다!