[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() 메소드를 사용하면 날짜와 시간 데이터를 매우 유연하게 원하는 문자열 형태로 표현할 수 있습니다. 다양한 포맷 코드를 조합하여 애플리케이션의 요구사항에 맞는 출력 형식을 만들어보세요. 더 많은 포맷 코드와 상세한 내용은 아래 공식 문서를 참고하시는 것이 좋습니다.

참고 자료

이 글이 파이썬으로 날짜와 시간 데이터를 다루는 데 도움이 되셨기를 바랍니다!