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으로 충분하다고 해요.