유닉스 타임스탬프와 시간 정밀도

각 나라에서 사용하는 표준 시간은 다르고 동일한 나라에서도 여러가지 시간 기준이 존재합니다. 그러나, 개발자들은 사람마다 다른 시간을 그대로 사용할 수 없으며 전세계적으로 사용되는 표준 시간으로 정의된 것을 따라야합니다. 세계협정시라고 부르는 UTC는 1970년 1월 1일을 기준으로 산정한 시간으로 보통 유닉스 시간 또는 유닉스 타임스탬프라고 합니다.

유닉스 시간

기본적으로 타임스탬프에 대해서 초 단위로 세어지는 정수로 표현한 값을 유닉스 시간(Unix Epoch) 또는 유닉스 타임스탬프라고 합니다. PostgreSQL 에서는 타임스탬프 유형의 컬럼에 대해서 EPOCH 키워드를 통해서 초 단위로 환산된 유닉스 시간을 추출할 수 있도록 지원합니다.

타임스탬프 정밀도

유닉스 시간이 정의되고 시간이 흘러 현재는 타임스탬프가 초 단위가 아닌 밀리고 그리고 심지어는 나노초 까지의 단위로 타임스탬프 정밀도를 지원하게 됩니다. 사용하는 언어 또는 외부 솔루션에 따라서 정밀도 표현 지원이 다르며 심지어 시계열 데이터베이스인 KDB+ 에서의 시간 유형은 1970년 1월 1일이 아닌 2000년 1월 1일을 기준의 나노초 정밀도를 가지는 타임스탬프를 지원합니다.

2000.01.01=0
1b

.z.p
2022.09.01D21:38:52.940328000

타임스탬프를 스칼라 실수로 변환해보면 나노초 단위로 세어진 정수값으로 표현되므로 다른 시스템과 연계하기 위해 1970년 1월 1일 부터의 밀리초 단위로 세어지는 정수값으로 환산할 수 있습니다. (1 나노초는 10^6 밀리초 입니다.)

floor((`long$2022.09.01D21:38:52.940328000)-`long$1970.01.01D00:00)%1e6
1662068332940

현재 조직에서는 초 단위의 유닉스 시간이 아닌 밀리초로 환산한 정수값을 토대로 타임스탬프에 대한 데이터를 시스템 간 전달하고 있습니다. 대부분의 시스템은 여러가지 언어로 작성된 애플리케이션과 외부 솔루션과의 연계를 수행하며 동작하게 되므로 각 시스템에서 지원하는 타임스탬프의 정밀도 표현 차이로 인해서 약간의 차이가 발생할 수 있음을 고려해야할 수 있습니다.

타임스탬프 표현

서버와 클라이언트 간 요청과 응답 시 전달되는 페이로드에 포함되는 타임스탬프는 어떻게 표현할 수 있을까요? 일반적으로 시스템 또는 개발자의 선호도에 따라서 UTC 기준의 Epoch라는 숫자 형태 또는 RFC 3339의 ISO 8601 형식으로 문자열 형태로 표현하게 됩니다. 더 나은 API 설계 시에는 ISO 8601 UTC를 사용해야한다는 관점이 있지만 간을 문자열로 표현하는 것에는 윤초 문제가 포함되어있기 때문에 윤초를 무시한 밀리초 단위의 유닉스 시간을 사용할때에도 있습니다. 예를 들어, 유튜브의 경우 사용자의 이벤트 트래킹을 위해 로그 이벤트를 전송할 때에 밀리초 단위의 정수값을 전달하고 있습니다.