타임스탬프(timestamp)란 특정 시점과 에포크(epoch, 1970년 1월 1일 00:00:00 UTC) 사이의 오프셋 값으로, 그 자체에는 시간대(timezone) 정보가 전혀 포함되어 있지 않습니다. 하지만 이를 '%Y-%m-%d %H:%M:%S'처럼 사람이 읽을 수 있는 문자열로 변환할 때 문자열에 시간대 정보가 없다면, 파이썬은 사용자가 로컬(시스템) 시간대 설정을 사용하길 원한다고 가정합니다.
naive datetime 객체와 timestamp()의 동작 방식
시간대 정보가 없는 naive datetime 객체에 datetime.timestamp() 메서드를 호출하면, 내부적으로 C 라이브러리의 mktime() 함수가 호출됩니다. 즉, 입력된 날짜와 시간은 '로컬 시간'으로 해석됩니다.
문제는 이 로컬 시간의 정의가 운영체제나 시스템 설정마다 다를 수 있다는 점입니다. 따라서 동일한 코드라도 컴퓨터마다 서로 다른 타임스탬프 결과가 나올 수 있습니다.
C mktime()의 한계
C의 mktime() 함수는 과거 특정 시점의 UTC 오프셋이 현재와 달랐는데, 시스템이 과거 시간대 이력 데이터베이스(historical timezone database)를 사용하지 않는 경우 잘못된 결과를 반환할 수 있습니다.
Unix와 Windows의 차이
Unix 계열 시스템(Linux, macOS 등)에서는 timestamp()를 호출할 때 인터프리터가 운영체제에서 제공하는 tz 데이터베이스(tz database)를 활용해 정확한 시간대 정보를 얻습니다. 반면 Windows에는 이러한 tz 데이터베이스가 기본적으로 존재하지 않기 때문에, 같은 코드라도 플랫폼에 따라 결과가 달라질 수 있습니다.
해결 방법
플랫폼 간 일관된 타임스탬프를 얻으려면 다음과 같은 방법을 권장합니다.
- datetime 객체 생성 시
timezone.utc등으로 명시적으로 시간대를 지정하여 aware 객체를 사용 pytz또는 파이썬 3.9 이상에서 제공되는zoneinfo모듈을 활용
이처럼 시간대를 명확히 지정하면 운영체제나 시스템 설정에 관계없이 항상 동일한 타임스탬프 값을 얻을 수 있습니다.