“이 로그, 결국 언제 찍힌 거야?”

시스템 개발 중 콘솔에 출력된 1736823600이라는 숫자.
“아, 이건 UNIX 타임이네”라고 이해는 해도, 구체적으로 그게 몇 월 며칠 몇 시인지 즉답할 수 있는 사람은 거의 없습니다.

UNIX 타임과 타임존의 기초 지식: 엔지니어가 알아두어야 할 핵심 정리

로그 조사, 데이터베이스 확인, API 디버깅… 엔지니어의 일상은 이 ‘사람이 읽기는 어렵지만 컴퓨터가 다루기에는 편한 숫자’와의 전쟁이기도 합니다.

UNIX 타임: 세계를 잇는 ‘초(Seconds)’

UNIX 타임(Epoch time)은 1970년 1월 1일 00:00:00 UTC부터 쌓여온 초 단위의 시간입니다.

애초에 왜 이렇게 읽기 불편한 숫자를 사용하는 걸까요?
그것은 전 세계에 흩어져 있는 컴퓨터들이 ‘지금 이 순간’을 정확하게 공유하기 위해서입니다.
‘한국의 오전 9시’는 ‘영국의 자정’이지만, UNIX 타임으로는 전 세계 어디서나 동일한 하나의 수치입니다. 이 간결함 덕분에 우리는 지구 반대편의 서버와도 동기화되어 데이터를 주고받을 수 있는 것입니다.

개발 현장에서 자주 마주치는 ‘3가지 함정’

원리를 알고 있어도 우리는 종종 ‘깜빡’ 실수를 하곤 합니다.

1. ‘초’와 ‘밀리초’의 혼동

JavaScript의 Date.now()는 13자리(밀리초)인 반면, PHP나 Python의 표준은 10자리(초)입니다.
“API를 호출했는데 날짜가 1970년으로 나와요!”라는 문제는 대부분 이 자릿수 차이를 인지하지 못해 발생합니다.

2. 타임존의 벽

UNIX 타임은 항상 UTC(협정 세계시) 기준이지만, 우리의 생활은 KST(한국 표준시) 기준입니다.
‘9시간의 차이’를 고려하지 못해 자정에 실행되어야 할 배치 작업이 대낮에 돌아가는 바람에 곤혹스러웠던 경험, 없으신가요?

3. ‘2038년’이라는 기한

먼 미래의 이야기 같지만 조금씩 다가오고 있습니다. 오래된 시스템을 다룰 기회가 있다면 “이 변수가 2038년에 넘쳐버리지는 않을까?”라는 관점을 갖는 것이 미래의 자신(혹은 후임자)을 구하는 길이 될 수 있습니다.

고민될 때는 ‘번역기’를 가까이 두세요

복잡한 계산이나 변환을 억지로 머릿속에서 하려 하지 말고 도구에 맡기세요.

DevToolKits의 **UNIX 타임 변환 도구**는 숫자를 붙여넣기만 하면 그것이 ‘초’인지 ‘밀리초’인지 자동으로 판별하여 UTC와 로컬 시간 모두로 순식간에 번역해 줍니다.

API 사양 확인이나 장애 조사로 정신없는 순간, 이 도구를 여러분의 ‘시간을 읽어주는 렌즈’로 활용해 보세요.

UTC를 한국 시간(KST)이나 일본 시간(JST)으로 바꾸는 쪽이 필요하다면, UTC⇄JST/KST 변환 레퍼런스 에 시차 대조표와 JavaScript·MySQL·CI의 cron이 조용히 시각을 어긋나게 하는 지점을 정리해 두었습니다.

마치며

함께 지내다 보면 UNIX 타임은 꽤 공평하고 합리적인 시스템이라는 것을 알게 됩니다.
숫자 너머에 있는 ‘시간’을 자유자재로 다룰 수 있게 되면 엔지니어로서의 시야는 더욱 넓고 선명해질 것입니다. 자, 시간을 내 편으로 만들어 더욱 즐거운 개발을 시작해 보세요!

자주 묻는 질문

유닉스 시간은 UTC인가요?

네. 유닉스 시간은 1970년 1월 1일 00:00:00 UTC를 기준으로 한 경과 초이며, 타임존의 개념을 갖지 않습니다. 같은 순간이라면 서울에서 보든 뉴욕에서 보든 값은 완전히 같습니다. 타임존이 관여하는 것은 사람이 읽을 수 있는 일시로 변환하는 단계뿐입니다.

JavaScript의 타임스탬프는 초 단위인가요?

아닙니다. Date.now() 가 돌려주는 값은 밀리초로, 일반적인 유닉스 시간의 1000배입니다. 서버가 초 단위로 반환하는 값을 그대로 new Date() 에 넣으면 1970년대의 날짜가 되고, 반대로 밀리초를 초로 착각하면 먼 미래가 됩니다. 자릿수로 구분할 수 있는데, 현재 시각이라면 초는 10자리, 밀리초는 13자리입니다.

1970년의 날짜가 되어 버리는 이유는 무엇인가요?

대부분 초와 밀리초를 잘못 다룬 경우입니다. 초 단위 값을 밀리초로 해석하면 기준 시각에서 거의 움직이지 않아 1970년 근처가 됩니다. 또 값이 null 이나 빈 문자열일 때 0으로 변환되어 정확히 1970-01-01이 되는 경우도 흔합니다. 어느 쪽인지는 유닉스 시간 변환 에 값을 붙여 넣어 확인할 수 있습니다.