에포크 시간을 읽기 쉬운 날짜로 변환하는 방법
Epoch 시간을 날짜로 변환하는 것은 두 단계입니다: 숫자를 UTC의 한 순간으로 디코딩한 다음, 그 순간을 원하는 시간대로 포맷하는 것입니다. 이 가이드는 멘탈 모델, 초와 밀리초를 구별하는 법, UTC 대 로컬 결정을 설명하고 언어별 레시피와 순간 변환기로 안내합니다.
Epoch에서 날짜는 두 단계
Epoch 타임스탬프를 읽기 쉬운 날짜로 변환하는 것은 늘 같은 두 단계입니다: 숫자를 UTC의 한 순간으로 디코딩한 다음, 그 순간을 표시하려는 시간대로 포맷합니다. 숫자 자체는 시간대를 지니지 않으며 — 하나의 순간일 뿐 — 그래서 같은 값도 포맷하는 시간대에 따라 다른 벽시계 시각(때로는 다른 달력 날짜)으로 표시됩니다. 아래 표는 하나의 타임스탬프를 여러 시간대로 나타낸 것입니다. 이 가이드의 나머지는 단위, 시간대 선택, 코드를 다룹니다.
| 시간대 | 1700000000의 로컬 날짜와 시간 |
|---|---|
| UTC(정준 순간) | 2023-11-14 22:13:20 · ISO 2023-11-14T22:13:20Z |
| America/New_York | 2023-11-14 17:13:20 (EST) |
| Asia/Tokyo | 2023-11-15 07:13:20 (JST) |
| Australia/Sydney | 2023-11-15 09:13:20 (AEDT) |
Epoch 시간이란?
Epoch 시간(Unix 시간 또는 POSIX 시간이라고도 함)은 1970년 1월 1일 00:00:00 UTC 이후 경과한 초의 수입니다. 컴퓨팅에서 시점을 표현하는 보편적 표준입니다. 모든 프로그래밍 언어와 운영체제가 기본 지원하여, 시스템 간 타임스탬프 저장·교환에 가장 신뢰할 수 있는 형식입니다.
1단계 — 초인지 밀리초인지 식별하기
변환하기 전에 단위를 파악하세요. 거의 언제나 자릿수로 읽어낼 수 있으며, 이를 잘못 읽는 것이 잘못된 날짜의 가장 흔한 원인입니다.
- 10자리(예: 1700000000) → Unix 에포크 이후의 초
- 13자리(예: 1700000000000) → Unix 에포크 이후의 밀리초
- 16자리 → 마이크로초; 19자리 → 나노초
- 확실하지 않으면 디코딩된 연도가 합리적인지 확인하세요 — 1970년이나 먼 미래의 날짜는 단위를 잘못 읽었다는 뜻입니다
- 위 변환기는 단위를 자동으로 감지합니다
2단계 — UTC로 디코딩한 다음 시간대 선택하기
Unix 타임스탬프는 정확히 하나의 순간으로 디코딩됩니다. 그 순간을 UTC로 표시할지 로컬 시간대로 표시할지는 숫자의 속성이 아니라 표현상의 결정입니다. 기계를 향한 모든 것 — 로그, API, 데이터베이스 저장, 서버 간 비교 — 에는 UTC를 선택하고, 사람에게 날짜를 보여주는 바로 그 순간에만 사용자의 IANA 시간대로 변환하세요. 시간대는 항상 IANA 이름(America/New_York)으로 식별하고, 맨 오프셋으로는 식별하지 마세요. 그래야 서머타임이 자동으로 적용됩니다.
- 기계를 향함(로그, API, 저장) → UTC로 표시, Z가 붙은 ISO 8601
- 사용자를 향함(마감, UI의 타임스탬프) → 사용자의 IANA 시간대로 변환
- 로컬 시간을 시간대 없이 저장하지 말 것 — UTC와 IANA 시간대 이름을 저장하라
코드로 변환하기
모든 현대 언어에는 두 단계를 모두 수행하는 한 줄짜리 내장 기능이 있습니다. 패턴은 늘 같습니다: 함수가 기대하는 단위로 값을 전달하고 UTC 또는 특정 시간대를 요청하세요. JavaScript 등은 아래에 있으며, 동반 레시피가 JavaScript, Python, PHP, Java, C#, Go, SQL, Excel, Google Sheets를 완전하게 다룹니다.
- JavaScript: new Date(1700000000 * 1000).toISOString() → "2023-11-14T22:13:20.000Z"
- Python: datetime.fromtimestamp(1700000000, tz=timezone.utc).isoformat()
- Shell: date -u -d @1700000000 (GNU) / date -u -r 1700000000 (BSD, macOS)
- SQL: TO_TIMESTAMP(1700000000) (Postgres), FROM_UNIXTIME(1700000000) (MySQL)
- 규칙: 초가 기대되는 곳에 초를 전달하라 — × 1000이 필요한 것은 JavaScript의 Date뿐
Epoch 시간 변환 시 흔한 실수
Unix 타임스탬프를 변환할 때 가장 흔한 오류입니다:
- JavaScript에서 초에 1000 곱하기를 잊음 — new Date(1700000000)은 2023년이 아니라 1970년이 됨
- JavaScript 밀리초를 서버 측 언어에서 그대로 초로 사용(1000배 오류)
- 시간대를 지정하지 않고 환경마다 다른 서버 로컬 시간대에 의존
- 타임스탬프를 정수가 아닌 문자열로 저장하여 숫자 비교와 연산이 깨짐
- Python에서 사용 중단된 datetime.utcfromtimestamp()를 사용 — 대신 fromtimestamp()에 tz=timezone.utc를 전달하라
관련 글
FAQ
- Epoch 시간을 날짜로 어떻게 변환하나요?
- 값이 초(10자리)인지 밀리초(13자리)인지 식별한 다음, 언어의 날짜 API로 변환하세요 — JavaScript에서는 new Date(seconds * 1000), Python에서는 datetime.fromtimestamp(seconds, tz=timezone.utc), 또는 위 변환기에 붙여넣으세요.
- Unix 타임스탬프로 new Date()가 1970이 되는 이유는?
- 밀리초를 기대하는 함수에 초 값을 전달했기 때문이며, 대개 JavaScript의 new Date()입니다. 먼저 10자리 초 값을 1000으로 곱하세요.
- Epoch 시간을 UTC로 변환해야 하나요, 아니면 로컬 시간으로?
- 로그, API, 서버 간 비교에는 UTC를 사용하고, 사용자의 로컬 시간대로의 변환은 표시할 때만 하세요. Epoch 값 자체는 시간대 중립적입니다.
- JavaScript에서 Unix 타임스탬프로 날짜를 어떻게 얻나요?
- new Date(seconds * 1000)은 Date 객체를 반환하며 toISOString(), toUTCString(), Intl.DateTimeFormat으로 포맷할 수 있습니다. JavaScript의 Date는 초가 아니라 밀리초를 기대하므로 곱셈이 필요합니다.
- Python에서 Unix 타임스탬프로 날짜를 어떻게 얻나요?
- 시간대를 인식하는 UTC datetime에는 datetime.fromtimestamp(seconds, tz=timezone.utc)를 사용하세요. 로컬 시간은 tz 인자를 생략하고, ISO 8601 문자열은 .isoformat()을 덧붙이세요.
- 같은 Epoch 값이 시간대마다 다른 날짜가 되나요?
- 순간은 어디서나 같지만, 표시하는 벽시계 날짜는 시간대에 따라 달라지며 — 심지어 다른 달력 날짜가 될 수도 있습니다. 1700000000은 뉴욕에서는 11월 14일, 도쿄에서는 11월 15일입니다.
- 타임스탬프를 날짜로 어떻게 변환하나요?
- 모든 현대 언어에는 한 줄짜리 내장 기능이 있습니다. 가장 어려운 부분은 타임스탬프가 초(10자리)인지 밀리초(13자리)인지 식별하는 것입니다 — 단위만 맞으면 변환 자체는 결코 실패하지 않습니다.