home

Python에서 시간다루기

T와 +09:00은 각각 날짜·시간 구분자와 시간대(UTC 오프셋)를 나타내는 ISO 8601 표기이고, aware/naive는 이런 시간대 정보의 유무에 따른 datetime 객체의 성격 차이입니다. 둘을 같이 보면 “문자열 형식”과 “Python 객체 속성” 두 레벨에서 시간대를 표현하는 방식이라고 이해하면 편합니다.

Aware VS Native

ISO 8601, “T”와 “+09:00”

  • 2025-12-11T21:47:00+09:00 같은 문자열이 ISO 8601 형식입니다.
  • T는 날짜와 시간을 구분하는 문자이고, +09:00은 UTC보다 9시간 빠른 시간대(한국 표준시)를 의미합니다.
  • 이런 문자열을 파싱하면 Python에서는 보통 tzinfo가 들어간 aware datetime이 됩니다.

Aware datetime 특징

예: datetime(2025, 12, 11, 21, 47, tzinfo=timezone(timedelta(hours=9))) 같은 형태

  • 특정 시간대(UTC, Asia/Seoul 등) 정보가 포함되어 있어 “절대 시각”을 명확히 표현합니다.
  • 서로 다른 시간대의 aware끼리는 내부적으로 UTC 기준으로 환산해서 정확하게 비교·연산·변환이 가능합니다.

Naive datetime 특징

예: datetime(2025, 12, 11, 21, 47) 처럼 tzinfo가 없는 객체

  • 내부적으로 “어느 시간대인지” 정보가 없어서, 서울 시간인지 UTC인지 코드만 보고는 알 수 없습니다.
  • 같은 naive끼리는 산술·비교가 되지만, aware와 섞어서 비교/연산하면 TypeError가 납니다.

문자열 형식 vs 객체 상태 요약

관점 예시 시간대 정보 분류
문자열 (ISO8601) 2025-12-11T21:47:00+09:00 있음 보통 aware로 파싱
문자열 (단순) 2025-12-11 21:47:00 없음 보통 naive로 파싱
Python 객체 datetime(..., tzinfo=None) 없음 naive
Python 객체 datetime(..., tzinfo=...) 있음 aware

실무에서는 보통 저장/전송은 ISO 8601(T, +09:00)로 하고, 애플리케이션 내부에서는 “무조건 aware(UTC 기준)” 하나로 통일해서 쓰는 패턴이 가장 안전하다고 합니다.

ISO 8601 형식(예: “2025-12-11T21:51:00+09: 시간대 정보(+09:00)가 무시되고 날짜·시간 부분만 보존됩니다.

Datetime VS TIMESTAMP

DATETIME 필드 동작

DATETIME은 시간대 무지(naive) 저장 방식으로, 입력 문자열의 시간 부분만 추출해 그대로 저장합니다.

INSERT INTO test (dt_col) VALUES ('2025-12-11T21:51:00+09:00');
SELECT dt_col;  *-- '2025-12-11 21:51:00'`

Python ORM에서 aware datetime.isoformat()을 전달해도 동일하게 처리되며, 조회 시 naive datetime으로 반환됩니다.

TIMESTAMP 필드 동작

TIMESTAMP는 서버 시간대 설정에 따라 입력값을 UTC로 변환 후 저장합니다.

*-- 서버 시간대가 Asia/Seoul(+09:00)일 때*
INSERT INTO test (ts_col) VALUES ('2025-12-11T21:51:00+09:00');
SELECT ts_col;  *-- '2025-12-11 12:51:00' (UTC로 변환되어 저장)*

조회 시 클라이언트 시간대로 다시 변환되므로, 입력 시점의 “로컬 시각”이 유지됩니다.

저장 결과 비교표

입력 문자열 DATETIME 저장 결과 TIMESTAMP 저장 결과 (서버 +09:00)
2025-12-11T21:51:00+09:00 2025-12-11 21:51:00 2025-12-11 12:51:00 (UTC)
2025-12-11 21:51:00 2025-12-11 21:51:00 2025-12-11 12:51:00 (UTC)

그럼 실무에서는? 시간대가 중요하면 항상 TIMESTAMP + UTC aware datetime 사용, 단순 로깅은 DATETIME으로 충분하다고 해요.