유틸리티

Unix 타임스탬프란, 숫자로 된 시간을 날짜로 읽는 법

서버 에러 로그를 열었더니, 시간 필드에 1709280000이라는 숫자 10자리만 찍혀 있다. 이게 날짜라는 건 짐작이 가는데, 2024년 3월 1일인지 2월 29일인지 숫자만 봐서는 알 수가 없다.

Unix 타임스탬프가 뭔데

Unix 타임스탬프(Epoch time)는 1970년 1월 1일 00:00:00 UTC부터 경과한 초(秒)의 수다. 날짜와 시간을 하나의 정수로 표현하는 방식이다. 시간대(timezone)에 영향받지 않고, 정렬과 비교가 쉬워서 서버, 데이터베이스, API에서 표준으로 쓰인다.

예를 들어 1709280000은 2024년 3월 1일 12:00:00 UTC다. 사람이 읽기엔 불편하지만, 컴퓨터가 처리하기엔 가장 깔끔한 포맷이다.

초(seconds)와 밀리초(milliseconds) 구분법

같은 타임스탬프라도 초 단위와 밀리초 단위가 있다. 구분법은 간단하다.

10자리 숫자
초 단위. 예: 1709280000 (2024-03-01)
13자리 숫자
밀리초 단위. 예: 1709280000000 (같은 시각)

JavaScript의 Date.now()는 밀리초를, Python의 time.time()은 초 단위를 반환한다. 언어에 따라 기본 단위가 다르니, 변환할 때 단위를 먼저 확인해야 한다.

타임스탬프를 날짜로 바꾸는 법

코드에서 직접 변환할 수도 있지만, 로그를 빠르게 확인하거나 디버깅할 때는 타임스탬프 변환기에 숫자를 넣는 게 빠르다. 초와 밀리초를 선택하면 로컬 시간, UTC, ISO 8601 형식을 한 번에 보여준다. 반대로 날짜를 입력해서 타임스탬프 숫자를 뽑을 수도 있고, 현재 시각의 타임스탬프가 실시간으로 표시되니 테스트 데이터 만들 때도 쓸 만하다.

TIP API 응답에서 타임스탬프가 10자리인데 값이 이상하게 크다면, 서버가 밀리초를 보내면서 단위 표시를 안 한 경우일 수 있다. 10자리인데 2286년 이후를 가리키면 밀리초를 초로 잘못 읽은 것이다.

2038년 문제

32비트 시스템에서는 타임스탬프를 부호 있는 32비트 정수로 저장한다. 이 정수의 최대값은 2,147,483,647이고, 이 값에 도달하는 시점이 2038년 1월 19일 03:14:07 UTC다. 이 시각 이후로는 오버플로우가 발생해서 1970년으로 돌아가거나 시스템 오류가 생긴다.

  • 64비트 시스템은 이 문제가 없다 (약 2,920억 년까지 표현 가능)
  • 현재 대부분의 서버와 프로그래밍 언어는 64비트를 사용한다
  • 임베디드 시스템이나 레거시 코드에서는 여전히 주의가 필요하다

타임스탬프는 숫자만 보면 의미를 알 수 없다. 변환 한 번이면 날짜가 보이고, 날짜를 넣으면 숫자가 나온다. 단위만 헷갈리지 않으면 어렵지 않다.