← 모든 글

Unix 시간을 날짜로 — 임의의 에포크를 읽기 쉬운 날짜로 변환

Unix 타임스탬프는 1970-01-01 UTC 이후의 초 수입니다. 날짜로 변환하려면 UTC로 디코딩한 다음 원하는 시간대로 형식을 지정합니다. 이 가이드는 JavaScript, Python, PHP, 셸, SQL(Postgres, MySQL, SQLite, BigQuery), Excel, Google Sheets에서의 방법을 초 대 밀리초 함정, UTC 대 로컬, 마이크로초 정밀도, 음수 타임스탬프, 2038년 문제와 함께 제공합니다.

Unix 시간을 날짜로 — 한 줄로

전체 작업을 예제 하나로 보여드립니다. Unix 타임스탬프 1700000000 은 2023-11-14T22:13:20Z(2023년 11월 14일 화요일 22:13:20 UTC)가 됩니다. Unix 타임스탬프는 1970-01-01 UTC 이후의 초를 세므로, 변환이란 그 카운트를 UTC로 디코딩하여 원하는 시간대로 형식을 지정하는 것입니다. 변환을 망치는 유일한 요인은 단위입니다. 10자리는 초, 13자리는 밀리초, 16자리는 마이크로초입니다. 아래 표는 이 가이드에서 다루는 각 언어와 도구의 복사해서 바로 쓰는 한 줄입니다.

언어 / 도구함수예상 단위기본값이 UTC?
JavaScriptnew Date(s * 1000)밀리초아니요 — timeZone 옵션 전달
Pythondatetime.fromtimestamp(s, tz=timezone.utc)tz를 설정한 경우에만
JavaInstant.ofEpochSecond(s)예 (Instant는 UTC)
C# / .NETDateTimeOffset.FromUnixTimeSeconds(s)예 (UTC 오프셋)
Gotime.Unix(s, 0).UTC().UTC() 사용
PHPgmdate('c', s)예 (gm = UTC)
셸 (GNU)date -u -d @s-u 사용
SQL (Postgres)TO_TIMESTAMP(s)예 (TIMESTAMPTZ)
Excel / Sheets=A1/86400 + DATE(1970,1,1)

Unix 시간을 날짜로 변환한다는 것의 의미

Unix 타임스탬프는 1970-01-01 UTC 이후의 초 수입니다. 날짜로 변환하려면 UTC로 디코딩한 다음 원하는 시간대로 형식을 지정합니다. 그것이 한 문장으로 표현한 문제의 전부이며, 가이드의 나머지는 각 언어의 구문일 뿐입니다. 모든 현대 프로그래밍 언어는 Unix 에포크 값을 받아 날짜 객체를 반환하는 내장 함수를 제공합니다. 주의할 유일한 점은 그 언어가 초(Python, PHP, Linux date), 밀리초(JavaScript Date), 마이크로초(PostgreSQL, BigQuery) 중 무엇을 기대하는지입니다.

빠른 변환 규칙

값의 자릿수를 세어 보세요. 10자리 숫자는 Unix 초입니다. 13자리 숫자는 Unix 밀리초입니다. 16자리 숫자는 Unix 마이크로초입니다. Unix 에포크는 1970-01-01에 시작되었으므로 현재(2026년) 10자리 값은 17 또는 18로 시작하고, 밀리초는 175 또는 176 뒤에 10자리가 붙으며, 마이크로초는 1758 또는 1759로 시작합니다. 변환 함수에 값을 전달하기 전에 단위를 판별하면 출력이 1970년이 아니라 올바른 날에 떨어집니다.

  • 10자리 → Unix 초 (범위 2001~2286년)
  • 13자리 → Unix 밀리초 (범위 2001~2286년)
  • 16자리 → Unix 마이크로초 (범위 2001~2286년)
  • 10^9(1,000,000,000)에 가까운 숫자는 2001년 이전의 초 — 여전히 유효한 Unix 시간
  • 음의 정수는 1970년 이전의 날짜 — 대부분의 언어가 처리하지만 확인 필요
  • INT 열에서 2^31을 초과하는 숫자는 2038년 한계에 도달 — 아래 참조

JavaScript에서 Unix 시간을 날짜로 변환

JavaScript의 Date 생성자는 밀리초를 기대하므로 Unix 초 값은 먼저 1000을 곱해야 합니다. 결과는 Date 객체입니다. UTC ISO 8601에는 toISOString(), 시간대를 인식하는 사람이 읽을 수 있는 문자열에는 Intl.DateTimeFormat으로 형식을 지정합니다. 항상 명시적인 timeZone 옵션을 전달하세요. 그렇지 않으면 JavaScript는 런타임의 로컬 시간대를 사용하며, 이는 개발용 노트북과 운영 서버에서 다릅니다.

  • new Date(1700000000 * 1000).toISOString() // '2023-11-14T22:13:20.000Z'
  • new Date(1700000000 * 1000).toLocaleString('en-US', { timeZone: 'America/New_York' }) // tz-aware
  • new Date(1700000000000).toISOString() // milliseconds — no × 1000 needed
  • new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Tokyo', dateStyle: 'full', timeStyle: 'long' }).format(new Date(ms))
  • Detect unit at runtime: const toDate = ts => new Date(ts < 1e11 ? ts * 1000 : ts)

Python에서 Unix 시간을 날짜로 변환

datetime.fromtimestamp(ts, tz=timezone.utc) 는 Python의 표준 변환입니다. UTC 결과를 위해 tz 인수가 필요하며, 없으면 Python은 시스템의 로컬 시간대로 타임스탬프를 반환합니다 — 서버에서 시간대 어긋남 버그의 흔한 원인입니다. utcfromtimestamp() 는 잘못 사용하기 쉬운 naive datetime을 반환했기 때문에 Python 3.12에서 더 이상 사용되지 않습니다. 밀리초는 1000으로, 마이크로초는 1,000,000으로 나눕니다. Python은 소수 초를 직접 허용합니다.

  • from datetime import datetime, timezone
  • datetime.fromtimestamp(1700000000, tz=timezone.utc) # 2023-11-14 22:13:20+00:00
  • datetime.fromtimestamp(1700000000.123, tz=timezone.utc) # fractional seconds work
  • datetime.fromtimestamp(ms / 1000, tz=timezone.utc) # from milliseconds
  • datetime.fromtimestamp(us / 1_000_000, tz=timezone.utc) # from microseconds
  • Avoid: datetime.utcfromtimestamp(ts) — deprecated in 3.12; returns naive datetime

PHP에서 Unix 시간을 날짜로 변환

PHP의 gmdate(format, timestamp) 는 주어진 Unix 초에 대한 UTC 날짜 문자열을 반환합니다. date(format, timestamp) 는 동일한 순간을 서버의 로컬 시간대(date_default_timezone_set 또는 php.ini로 제어)로 반환합니다. DateTimeZone과 함께 사용하는 DateTime 클래스는 현대적이고 불변인 API를 제공하며 임의의 IANA 시간대 이름을 지원합니다. PHP는 기본적으로 초 단위로 작동하므로 밀리초 값은 먼저 1000으로 나누세요.

  • gmdate('c', 1700000000) // '2023-11-14T22:13:20+00:00' (UTC ISO 8601)
  • date('Y-m-d H:i:s', 1700000000) // server-local — depends on date.timezone setting
  • new DateTime('@1700000000') // immutable, UTC by default with the @ prefix
  • (new DateTime('@1700000000'))->setTimezone(new DateTimeZone('Asia/Tokyo'))->format('c')
  • DateTime::createFromFormat('U.u', '1700000000.123456') // sub-second precision

Java에서 Unix 시간을 날짜로 변환

Java의 java.time API(Java 8+)는 Instant.ofEpochSecond(s) 로 Unix 초를 변환하여 UTC 인스턴트를 반환합니다. Instant는 항상 UTC이므로 숨겨진 로컬 시간대 함정이 없습니다. 밀리초 입력에는 Instant.ofEpochMilli(ms) 를 사용하고, 벽시계 표현에는 atZone(ZoneId.of(...)) 로 영역을 붙이며, DateTimeFormatter로 형식을 지정합니다. 레거시 java.util.Date 생성자는 JavaScript처럼 밀리초를 기대하므로 먼저 초에 1000L을 곱하세요.

  • Instant.ofEpochSecond(1700000000) // 2023-11-14T22:13:20Z (UTC)
  • Instant.ofEpochMilli(1700000000000L) // from milliseconds
  • Instant.ofEpochSecond(1700000000).atZone(ZoneId.of("Asia/Tokyo")) // tz-aware
  • DateTimeFormatter.ISO_INSTANT.format(Instant.ofEpochSecond(s)) // ISO 8601
  • new java.util.Date(1700000000L * 1000) // legacy API — expects milliseconds

C#(.NET)에서 Unix 시간을 날짜로 변환

.NET에서 DateTimeOffset.FromUnixTimeSeconds(s) 가 현대적인 변환으로, UTC(+00:00)에 고정된 DateTimeOffset을 반환합니다. 밀리초 입력에는 FromUnixTimeMilliseconds(ms) 를 사용합니다. UTC DateTime에는 .UtcDateTime을 읽고, 특정 영역으로의 변환에는 TimeZoneInfo.ConvertTime을 사용합니다. ISO 8601에는 왕복 지정자 "o" 로 형식을 지정합니다. 내장 Unix 메서드(.NET 4.6에서 추가)가 에포크 계산을 처리하므로 오래된 DateTime.AddSeconds(1970년 기준) 패턴은 피하세요.

  • DateTimeOffset.FromUnixTimeSeconds(1700000000) // 2023-11-14 22:13:20 +00:00
  • DateTimeOffset.FromUnixTimeMilliseconds(1700000000000) // from milliseconds
  • DateTimeOffset.FromUnixTimeSeconds(s).UtcDateTime // DateTime in UTC
  • TimeZoneInfo.ConvertTime(dto, tzInfo) // tz-aware rendering
  • DateTimeOffset.FromUnixTimeSeconds(s).ToString("o") // ISO 8601 round-trip

Go에서 Unix 시간을 날짜로 변환

Go의 time.Unix(sec, nsec) 는 Unix 초(및 선택적 나노초)로부터 Time을 만들지만 값을 로컬 시간대로 반환하므로 .UTC() 를 호출하여 고정합니다. Go 1.17에서 time.UnixMilli(ms) 와 time.UnixMicro(us) 가 추가되어 더 이상 수동으로 나눌 필요가 없습니다. ISO 8601에는 RFC3339 상수로 형식을 지정하고, 특정 영역에는 time.LoadLocation과 .In(loc) 을 사용합니다.

  • time.Unix(1700000000, 0).UTC() // 2023-11-14 22:13:20 +0000 UTC
  • time.UnixMilli(1700000000000).UTC() // from milliseconds (Go 1.17+)
  • time.UnixMicro(1700000000000000).UTC() // from microseconds (Go 1.17+)
  • time.Unix(1700000000, 0).Format(time.RFC3339) // ISO 8601 string
  • time.Unix(s, 0).In(loc) // tz-aware; loc from time.LoadLocation

셸(Linux / macOS)에서 Unix 시간을 날짜로 변환

Linux에서는 GNU date 명령이 -d @ts 로 Unix 초에서 변환하고, macOS에서는 BSD date 명령이 -r ts 로 같은 작업을 합니다. 플래그는 역사적 구현에 따라 다르지만 에포크 계산 자체는 동일합니다. -u 플래그는 TZ 환경 변수와 관계없이 UTC 출력을 강제합니다. 두 구현 모두 +%FORMAT 인수로 임의의 출력 형식을 지원합니다. 가장 유용한 형식 문자열을 아래에 정리했습니다.

  • GNU (Linux): date -u -d @1700000000 // 'Tue Nov 14 22:13:20 UTC 2023'
  • GNU: date -u -d @1700000000 +'%Y-%m-%dT%H:%M:%SZ' // ISO 8601 UTC
  • BSD (macOS): date -u -r 1700000000 // same result, different flag
  • BSD: date -u -r 1700000000 +'%Y-%m-%dT%H:%M:%SZ'
  • Both: omit -u to use TZ environment variable; export TZ=America/New_York to override
  • Sub-second: date -u -d @1700000000.123 +'%Y-%m-%dT%H:%M:%S.%3NZ' (GNU only)

SQL(Postgres, MySQL, SQLite, BigQuery)에서 Unix 시간을 날짜로 변환

모든 주요 SQL 방언에는 Unix 초(또는 밀리초, 마이크로초)를 네이티브 타임스탬프 열로 변환하는 내장 함수가 있습니다. 함수 이름은 다르지만 각 함수가 기대하는 단위는 문서화되어 있고 데이터베이스 내에서 일관됩니다. 날짜 산술로 직접 계산하지 말고 전용 함수를 사용하세요. 내장 함수는 윤년, 초 미만 정밀도, 시간대 변환을 올바르게 처리합니다.

  • PostgreSQL: TO_TIMESTAMP(1700000000) // returns TIMESTAMPTZ
  • PostgreSQL: TO_TIMESTAMP(unix_us / 1000000.0) // for microsecond input
  • MySQL: FROM_UNIXTIME(1700000000) // returns DATETIME in session timezone
  • MySQL: CONVERT_TZ(FROM_UNIXTIME(ts), @@session.time_zone, 'UTC') // force UTC
  • SQLite: datetime(1700000000, 'unixepoch') // returns TEXT 'YYYY-MM-DD HH:MM:SS'
  • SQLite: datetime(ms / 1000, 'unixepoch') // from milliseconds
  • BigQuery: TIMESTAMP_SECONDS(1700000000), TIMESTAMP_MILLIS(ms), TIMESTAMP_MICROS(us)
  • ClickHouse: toDateTime(1700000000), fromUnixTimestamp(1700000000)

Excel에서 Unix 시간을 날짜로 변환

Excel은 날짜를 일련 번호(1900-01-01 이후의 일수)로 저장합니다. Unix 타임스탬프를 Excel 날짜로 변환하는 것은 단순한 단위 변환입니다. Unix 초를 86,400(하루의 초)으로 나누고 1970-01-01 날짜를 더한 다음 셀을 날짜로 서식 지정합니다. 수식 =A1/86400 + DATE(1970,1,1) 이 표준 답이며 모든 현대 Excel에서 작동합니다. 밀리초의 경우 대신 86,400,000으로 나눕니다. 수식을 입력한 후 셀을 선택하고 [셀 서식](Ctrl+1)을 열어 [표시 형식] 탭에서 날짜 형식을 선택합니다.

  • Seconds: =A1/86400 + DATE(1970,1,1) // when A1 holds the Unix seconds value
  • Milliseconds: =A1/86400000 + DATE(1970,1,1)
  • Microseconds: =A1/86400000000 + DATE(1970,1,1)
  • Format cell as Date after entering the formula (Ctrl+1 → Number → Date)
  • Caveat: Excel's epoch is 1900-01-01, not 1970, hence the + DATE(1970,1,1) offset
  • Reverse direction (date to Unix): =(A1 - DATE(1970,1,1)) * 86400

Google Sheets에서 Unix 시간을 날짜로 변환

Google Sheets는 Excel과 동일한 표준 수식을 받아들이고 전용 EPOCHTODATE 함수도 제공합니다. 짧은 형식은 =EPOCHTODATE(A1, 1) 이며, 두 번째 인수는 단위 코드입니다(1 = 초, 2 = 밀리초, 3 = 마이크로초). 출력은 UTC에 고정된 날짜로, Sheets는 시트의 로케일 설정에 따라 표시합니다. 서로 다른 시간대의 팀 간에 공유되는 시트의 경우 날짜가 나타내야 하는 시간대를 열 머리글에 문서화하세요.

  • =EPOCHTODATE(A1, 1) // seconds — shorthand
  • =EPOCHTODATE(A1, 2) // milliseconds
  • =EPOCHTODATE(A1, 3) // microseconds
  • =A1/86400 + DATE(1970,1,1) // canonical formula — works in Sheets too
  • Reverse direction: =(A1 - DATE(1970,1,1)) * 86400
  • Time zone applied is the sheet's locale; check File → Settings → Time zone

UTC 날짜 대 로컬 날짜 — 무엇을 표시할까

Unix 타임스탬프는 벽시계 표시가 아니라 순간을 인코딩합니다. 서로 다른 시간대의 두 방문자는 동일한 Unix 타임스탬프를 서로 다른 벽시계 날짜로 봅니다. 올바른 동작은 날짜가 무엇을 나타내는지에 달려 있습니다. 이벤트 로그와 감사 기록은 지역 간 비교를 위해 UTC로 표시해야 하고, 사용자 대상 날짜(마감일, 회의 시간, 만료 알림)는 사용자의 로컬 시간대로 표시해야 합니다. 항상 하나를 선택하여 문서화하고, 이미 로컬 시간으로 변환된 문자열을 그 출처 시간대 없이 저장하지 마세요.

  • 서버 로그 → UTC로 표시하고 열이나 차트 축에 명시적으로 레이블 지정
  • 사용자 대상 마감일 → 사용자의 시간대로 표시(Intl.DateTimeFormat().resolvedOptions().timeZone 으로 자동 감지)
  • 반복 일정('매주 월요일 오전 9시 Eastern') → 규칙과 함께 시간대를 저장하고 실행할 때마다 다음 순간을 다시 계산
  • API 응답 → Z 접미사가 있는 ISO 8601(UTC)이 안전한 기본값. 변환은 클라이언트에 맡김
  • 데이터베이스 저장 → 항상 UTC. 표현 계층에서만 변환

엣지 케이스: 초 미만 정밀도, 음수 타임스탬프, 2038년

세 가지 엣지 케이스가 그 외에는 올바른 코드를 넘어뜨립니다. 마이크로초 타임스탬프(16자리)는 명시적인 단위 처리가 필요하며, 초로 취급하면 100만 배 미래의 날짜가 됩니다. 음수 Unix 타임스탬프는 1970년 이전의 날짜를 나타냅니다. 대부분의 언어가 처리하지만 Excel, Google Sheets, 일부 SQL 함수는 1970년에서 멈추거나 오류를 반환합니다. 2038년 문제는 32비트 부호 있는 정수 오버플로로, 2038-01-19 03:14:07 UTC에 발생합니다. 그 이후의 값은 BIGINT 저장 또는 64비트 time_t가 필요합니다.

  • 마이크로초(16자리) — 언어 수준의 초 함수에 전달하기 전에 1,000,000으로 나눔
  • 음수 초 — 1970년 이전 날짜. JavaScript Date, Python datetime, PHP DateTime 모두 처리
  • Excel의 음수 초 — #### 또는 잘못된 날짜 발생. 수식 =A1/86400 + DATE(1970,1,1) 은 양수 값에만 사용
  • 2038년 — INT 및 부호 있는 32비트 time_t는 2147483647 = 2038-01-19 03:14:07 UTC에서 오버플로
  • 2038년 이후 — BIGINT로 저장(부호 있는 64비트는 에포크 양쪽으로 2920억 년을 포괄)
  • Excel에서 1900년 이전 — 앱에 표시 수단이 없음. 텍스트로 변환하거나 기원전 지원 상위 라이브러리 사용

Unix 시간을 날짜로 변환할 때 흔한 버그

누군가 처음으로 Unix 시간을 날짜로 변환할 때마다 같은 버그가 나타납니다. 결과가 1970년이 되는 것입니다. 원인은 거의 항상 JavaScript에서 빠뜨린 × 1000, Python에서 누락된 tz 인수, 또는 Excel이 자동으로 잘라낸 숫자 열입니다. 관련 버그 문서는 10가지를 모두 정리하며, 각각은 언젠가 Unix 시간을 변환하는 코드에 나타납니다. 한 번 훑어보면 대부분이 운영 환경에 도달하지 않습니다.

  • 날짜가 1970년으로 표시됨 — 밀리초가 기대되는 곳에 초를 전달함(JS Date 생성자)
  • 날짜가 로컬 UTC 오프셋만큼 어긋남 — tz=timezone.utc(Python) 또는 timeZone 옵션(JS) 지정을 잊음
  • Excel이 ##### 또는 #VALUE! 오류 표시 — 셀이 날짜로 서식 지정되지 않았거나 값이 음수
  • SQL FROM_UNIXTIME이 잘못된 벽시계 반환 — MySQL은 @@session.time_zone을 적용함. UTC를 명시적으로 강제
  • 서버와 노트북이 다른 날짜 생성 — 시스템 시간대가 다름. 항상 tz를 명시적으로 전달

FAQ

Unix 타임스탬프에서 날짜를 가져오려면 어떻게 하나요?
값이 초(10자리)인지 밀리초(13자리)인지 판별한 다음, 언어의 내장 변환을 호출합니다. JavaScript는 new Date(seconds * 1000), Python은 datetime.fromtimestamp(seconds, tz=timezone.utc), PHP는 gmdate('c', seconds), 셸은 date -u -d @seconds 입니다.
JavaScript에서 Unix 타임스탬프로부터 날짜를 가져오려면?
초 값을 1000으로 곱한 다음(JavaScript의 Date 생성자는 밀리초를 기대함) toISOString() 또는 Intl.DateTimeFormat으로 형식을 지정합니다. 예: new Date(1700000000 * 1000).toISOString() 은 "2023-11-14T22:13:20.000Z" 를 반환합니다.
Python에서 Unix 타임스탬프로부터 날짜를 가져오려면?
datetime.fromtimestamp(unix_seconds, tz=timezone.utc) 를 사용합니다. UTC 결과를 위해 tz 인수가 필요하며, 없으면 Python은 시스템의 로컬 시간대로 타임스탬프를 반환합니다. utcfromtimestamp() 는 Python 3.12에서 더 이상 사용되지 않습니다.
Unix 시간을 날짜로 어떻게 변환하나요?
올바른 단위(초 또는 밀리초)와 UTC 시간대를 지정하여 값을 언어의 내장 에포크→datetime 함수에 전달합니다. 결과는 동일한 순간을 사람이 읽을 수 있는 날짜로 형식화한 것입니다.
Linux 시간은 Unix 시간과 같나요?
네. Linux, macOS 및 모든 Unix 계열 시스템은 동일한 에포크 기준(1970-01-01 00:00:00 UTC 이후의 초)을 사용합니다. date 명령, time() 시스템 호출, clock_gettime() 모두 Unix 시간을 반환합니다.
왜 내 Unix 타임스탬프가 1970년으로 변환되나요?
거의 항상 밀리초를 기대하는 함수에 초를 전달했기 때문입니다(또는 0 / null이 숫자로 변환된 경우). JavaScript에서 new Date(1700000000) 은 1970년 1월이 됩니다. 생성자가 밀리초를 기대하므로 먼저 1000을 곱하세요.
Excel에서 Unix 시간을 날짜로 변환하려면?
A1에 Unix 초가 있을 때 =A1/86400 + DATE(1970,1,1) 을 사용합니다. 결과는 [셀 서식] 대화상자에서 날짜로 서식을 지정합니다. 밀리초의 경우 먼저 86400000으로 나눕니다: =A1/86400000 + DATE(1970,1,1).
Google Sheets에서 Unix 시간을 날짜로 변환하려면?
Excel과 동일한 표준 수식: =A1/86400 + DATE(1970,1,1). Google Sheets는 더 짧은 =EPOCHTODATE(A1, 1) 도 허용하며, 두 번째 인수는 단위입니다(1 = 초, 2 = 밀리초, 3 = 마이크로초).
마이크로초 Unix 타임스탬프(16자리)는 어떻게 처리하나요?
1,000,000으로 나누어 초를 구한 다음 평소처럼 변환합니다. Python 3.7+ 은 소수 초를 직접 허용합니다: datetime.fromtimestamp(unix_us / 1_000_000, tz=timezone.utc). PostgreSQL TO_TIMESTAMP 과 BigQuery TIMESTAMP_MICROS 는 마이크로초를 기본 지원합니다.