유틸리티

Unix 타임스탬프란, 1970년부터 세는 시간의 원리

에러 로그를 까봤더니 시간이 1709251200이라고 찍혀 있다. 날짜가 아니라 그냥 숫자다. 이 에러가 언제 발생한 건지 확인하려면 이 숫자를 날짜로 바꿔야 한다. 이게 Unix 타임스탬프다.

Unix 타임스탬프의 원리

1970년 1월 1일 00:00:00 UTC를 기준점(Epoch)으로 잡고, 거기서 몇 초가 지났는지를 숫자 하나로 표현한다. 예를 들어 1709251200은 Epoch에서 1,709,251,200초가 지난 시점, 즉 2024년 3월 1일 00:00:00 UTC다.

전 세계 어디서든 같은 숫자가 같은 순간을 가리킨다. 타임존이 다르면 "현지 시간"은 달라도, 타임스탬프 값 자체는 동일하다. 서버 간 시간 동기화가 쉬운 이유다.

초 vs 밀리초 구분법

같은 타임스탬프라도 시스템마다 단위가 다를 수 있다.

단위자릿수예시사용처
초(seconds)10자리1709251200Unix/Linux, PHP, Python
밀리초(ms)13자리1709251200000JavaScript, Java, API 응답

로그에서 13자리 숫자를 보면 밀리초 단위다. 10자리면 초 단위. 단위를 잘못 넣으면 1970년 1월이나 55,000년 같은 엉뚱한 날짜가 나온다.

실시간 변환이 필요한 상황

디버깅할 때 로그의 타임스탬프를 일일이 코드로 변환하기 귀찮다. 타임스탬프 변환기를 열어두면 현재 Unix 시간이 매초 갱신되면서 표시되고, 숫자를 넣으면 로컬 시간, UTC, ISO 8601 형식으로 바로 바꿔준다. 반대로 날짜를 넣어서 타임스탬프 값을 뽑을 수도 있다.

개발에서 타임스탬프를 쓰는 이유

  • 타임존 무관: 한국(KST)이든 미국(EST)이든 같은 숫자가 같은 시점을 의미한다. 글로벌 서비스에서 시간 비교가 깔끔해진다
  • 정렬/비교가 쉬움: 숫자니까 대소 비교만으로 선후 관계가 결정된다. 문자열 날짜 비교처럼 포맷을 신경 쓸 필요 없다
  • 저장 효율: 4바이트 정수 하나로 날짜와 시간을 모두 표현한다. "2024-03-01T00:00:00+09:00" 같은 문자열보다 훨씬 가볍다

2038년 문제

32비트 시스템에서 타임스탬프는 부호 있는 정수로 저장된다. 최대값이 2,147,483,647인데, 이 값은 2038년 1월 19일 03:14:07 UTC에 해당한다. 이 시점이 지나면 숫자가 넘쳐서 1901년으로 돌아가 버린다.

참고 64비트 시스템에서는 이 문제가 없다. 대부분의 최신 OS와 프로그래밍 언어는 이미 64비트 타임스탬프로 전환했지만, 임베디드 시스템이나 레거시 코드에서는 여전히 주의가 필요하다.

타임스탬프는 결국 "기준점에서 몇 초"라는 단순한 개념이다. 단위(초/밀리초)만 맞추면 시간 관련 버그의 절반은 줄일 수 있다.