초인가 밀리초인가
Unix 타임스탬프는 1970년 1월 1일 0시 UTC부터 흐른 시간입니다. 문제는 이 값을 초로 세는 곳과 밀리초로 세는 곳이 섞여 있다는 점입니다.
- 초 — 유닉스 계열 명령, PostgreSQL과 MySQL의 시간 함수, JWT의
exp·iat, 대부분의 REST API - 밀리초 — 자바스크립트의
Date.now(), 자바의System.currentTimeMillis(), 여러 로그 수집 도구
단위를 헷갈리면 1970년 1월 어느 날이 나오거나(밀리초를 초로 읽음) 서기 5만 년대가 나옵니다(초를 밀리초로 읽음). 이 도구는 값의 크기로 단위를 짐작해 어느 쪽으로 읽었는지 함께 표시하니, 결과가 이상하면 그 표시부터 확인하세요.
시간대 함정
타임스탬프 자체에는 시간대가 없습니다. 어느 순간을 가리키는 숫자 하나일 뿐이고, 시간대는 그 숫자를 사람이 읽는 글자로 바꿀 때 붙습니다. 그래서 같은 값이 서울에서는 오후 4시, 런던에서는 오전 7시로 보입니다.
버그 제보에 “오후 3시에 실패했습니다”라고만 적혀 있으면 어느 시간대인지 알 수 없습니다. 로그에는 타임스탬프나 오프셋이 붙은 ISO 8601 문자열을 남기고, 사람이 읽는 시각은 화면에서만 만드세요.
2038년 문제
타임스탬프를 32비트 부호 있는 정수에 담으면 2038년 1월 19일에 넘칩니다. 그 순간 값이 음수로 돌아 1901년이 됩니다. 요즘 언어와 데이터베이스는 대부분 64비트를 쓰지만, 오래된 임베디드 장비나 옛 C 코드를 유지보수 중이라면 저장 폭을 한 번 확인해 둘 만합니다.
음수와 0
음수는 1970년 이전을 가리킵니다. 생년월일처럼 오래된 날짜를 타임스탬프로 저장하면 이 값이 나오는데, 라이브러리 중에는 음수를 제대로 다루지 못하는 것도 있습니다.
0은 1970년 1월 1일 0시 UTC입니다. 데이터에서 이 값이 보인다면 대개 실제 시각이 아니라 초기화되지 않은 필드입니다.