Unix 타임스탬프 형식 설명
모든 Unix 타임스탬프 형식의 완전한 참고 자료 — 초, 밀리초, 마이크로초, ISO 8601, RFC 2822 — 각 언어와 데이터베이스가 어떤 형식을 쓰는지 보여 주는 예시와, 한눈에 구분하는 법을 함께.
모든 Unix 타임스탬프 형식 한눈에
Unix 타임스탬프는 그저 숫자이고, 그 형식은 사실 그 단위 — 1970년 1월 1일 UTC부터 얼마나 정밀하게 세는지 — 일 뿐입니다. 단위는 거의 항상 자릿수로 읽힙니다: 10자리는 초, 13은 밀리초, 16은 마이크로초, 19는 나노초. 두 문자열 형식 ISO 8601과 RFC 2822는 대신 자기 기술적입니다. 아래 표가 전체 그림이고, 그 뒤의 절들이 각 형식과 구분법을 다룹니다.
| 형식 | 자릿수 | 예 | 쓰는 곳 |
|---|---|---|---|
| 초 | 10 | 1700000000 | Python, PHP, Go, Ruby, C, SQL |
| 밀리초 | 13 | 1700000000000 | JavaScript, Java, .NET |
| 마이크로초 | 16 | 1700000000000000 | PostgreSQL, Rust |
| 나노초 | 19 | 1700000000000000000 | Go UnixNano, 트레이싱 시스템 |
| ISO 8601 | 문자열 | 2023-11-15T06:13:20Z | API, 로그(자기 기술적) |
| RFC 2822 | 문자열 | Wed, 15 Nov 2023 06:13:20 GMT | 이메일, HTTP 헤더 |
초 단위 Unix 시간 — 보편적 형식
가장 흔한 형식: 1970년 1월 1일 00:00:00 UTC 이후의 온전한 초를 세는 32비트 또는 64비트 정수. 현재 약 17억의 10자리 숫자입니다.
- 예: 1700000000 = 2023-11-15 06:13:20 UTC
- 쓰는 곳: Python time.time(), PHP time(), Go time.Now().Unix(), Ruby Time.now.to_i, C time(NULL)
- 저장 형태: 32비트 int(레거시, 최대 연도 2038), 64비트 int(현대, 수십억 년 안전)
- 데이터베이스: MySQL UNIX_TIMESTAMP(), PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT
밀리초 단위 Unix 시간 — JavaScript의 형식
Unix 에포크 이후의 밀리초: 밀리초 정밀도를 제공하는 13자리 정수. JavaScript의 Date 객체가 내부적으로 쓰는 형식입니다.
- 예: 1700000000000 = 2023-11-15 06:13:20.000 UTC
- 쓰는 곳: JavaScript Date.now(), Java System.currentTimeMillis(), .NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
- 초로 변환: Math.floor(ms / 1000)
- 초에서 변환: seconds * 1000
ISO 8601 — 사람이 읽기 좋은 표준
ISO 8601은 날짜와 시각을 문자열로 표현하는 국제 표준입니다. Unix 타임스탬프와 달리 자기 기술적입니다: 형식이 날짜/시각과 시간대 오프셋을 모두 부호화합니다.
- 2023-11-15T06:13:20Z — UTC(Z 접미사는 UTC를 뜻함)
- 2023-11-15T01:13:20-05:00 — 명시적 UTC 오프셋 포함(EST)
- 2023-11-15T06:13:20.000Z — 밀리초 포함
- JavaScript: date.toISOString()은 항상 Z 접미사의 UTC를 반환
- Python: datetime.isoformat(), Go: time.Format(time.RFC3339)
RFC 2822 — 이메일과 HTTP 날짜 형식
RFC 2822(이메일은 RFC 5322로 갱신, HTTP는 RFC 9110으로 반영)는 이메일 헤더와 HTTP 응답에서 쓰이는 사람이 읽기 좋은 날짜 형식입니다. JavaScript의 Date.toUTCString()이 이 형식을 반환합니다.
- 예: Wed, 15 Nov 2023 06:13:20 GMT
- 쓰이는 곳: HTTP 응답 헤더(Last-Modified, Date, Expires), 이메일 헤더(Date:)
- JavaScript: date.toUTCString()
- 현대 API에서는 드물지만 웹 인프라에서는 아직 널리 마주침
타임스탬프 형식을 감지하는 법
알 수 없는 타임스탬프 값을 받았을 때 이 규칙들이 그 형식을 식별합니다. 자릿수가 모든 숫자 사례를 정하고, 두 문자열 형식은 보면 바로 명백합니다.
| 단서 | 형식 |
|---|---|
| 10자리 | Unix 초 |
| 13자리 | Unix 밀리초 |
| 16자리 | 마이크로초 |
| 19자리 | 나노초 |
| T 또는 Z 포함 | ISO 8601 |
| 쉼표 또는 요일 이름 | RFC 2822 |
| 음의 정수 | 1970년 이전의 초 또는 밀리초 |
- 상식 점검: 어떤 숫자 값이든 현재 시대(10자리 초면 대략 2001~2038년)의 믿을 만한 날짜로 디코딩되어야 함
- 1970년 근처나 수천 년 떨어진 날짜는 단위를 잘못 읽었다는 뜻
마이크로초와 나노초
일부 고정밀 시스템은 밀리초보다 작은 단위를 씁니다. 애플리케이션 코드에서는 드물지만 저수준 시스템, 데이터베이스 내부, 관측성 도구에 나타납니다.
- 마이크로초(µs): 16자리 정수 — Rust SystemTime as_micros(), PostgreSQL clock_gettime()
- 나노초(ns): 19자리 정수 — Go time.Now().UnixNano(), Rust SystemTime as_nanos()
- PostgreSQL EXTRACT(EPOCH)는 마이크로초를 소수부로 갖는 부동소수점 수를 반환
- 나노초를 초로 변환: 1,000,000,000(1e9)으로 나눔
해상도와 초 미만 정밀도
위의 각 형식은 서로 다른 시간 해상도를 지닙니다. 형식을 고른다는 것은 두 순간을 얼마나 정밀하게 구별할 수 있는지 — 1초부터 1나노초까지 — 를 고르는 것입니다.
- 1초 해상도: Unix 초(10자리), 전통적 POSIX time_t
- 1밀리초: JavaScript Date, MongoDB BSON Date, Java Instant.toEpochMilli()
- 1마이크로초: Chrome/WebKit 타임스탬프, Python datetime.timestamp(), PostgreSQL timestamp precision 6
- 100나노초: Windows FILETIME, .NET DateTime.Ticks
- 1나노초: Java Instant(완전 정밀도), Go time.UnixNano(), JS Temporal.Instant.epochNanoseconds(BigInt)
- 피코초 이하: PTP/IEEE 1588 와이어 형식(1초의 1/2^32), NTP 소수 필드
- 필요를 충족하는 가장 거친 해상도를 골라라 — 초 미만 정밀도는 JSON 직렬화나 문자열 왕복에서 자주 손실됨
- 형식 간 변환 시 Unix 밀리초나 나노초(BigInt 경유)를 거쳐라 — 그것이 정밀도를 보존하는 최소 공통분모
타임스탬프 형식 변환기
Unix 시간과, 현장에서 마주치는 플랫폼별 타임스탬프 형식 사이를 변환하세요:
FAQ
- Unix 타임스탬프는 몇 자리인가요?
- 현대의 초 단위 Unix 타임스탬프는 10자리(약 17억), 밀리초 단위는 13자리입니다. 마이크로초는 16자리, 나노초는 19자리입니다.
- JavaScript는 어떤 타임스탬프 형식을 쓰나요?
- JavaScript의 Date는 밀리초로 동작합니다 — Date.now()는 13자리 밀리초 타임스탬프를 반환하고, new Date(ms)는 밀리초를 기대합니다. Date에 넘기기 전에 Unix 초에 1000을 곱하세요.
- Unix 시간과 ISO 8601의 차이는 무엇인가요?
- Unix 시간은 1970년 UTC 이후의 초 또는 밀리초를 나타내는 단일 숫자이며 시간대를 갖지 않습니다. ISO 8601은 2023-11-15T06:13:20Z 같은 자기 기술적 문자열로 날짜, 시각, 오프셋을 부호화합니다.
- RFC 2822 날짜 형식이란 무엇인가요?
- RFC 2822(RFC 5322로 갱신)는 이메일과 HTTP 헤더에서 쓰이는 사람이 읽기 좋은 날짜 형식으로, "Wed, 15 Nov 2023 06:13:20 GMT" 같은 것입니다. JavaScript는 date.toUTCString()으로 생성합니다.
- 타임스탬프가 초인지 밀리초인지 어떻게 구분하나요?
- 자릿수를 세세요 — 10자리 값은 초, 13자리 값은 밀리초입니다. 값이 1970년 근처나 먼 미래의 날짜로 변환되면 단위를 잘못 읽은 것입니다.