FILETIME Converter

Windows FILETIME → Unix 타임스탬프 변환기

Windows FILETIME을(를) Unix 시간으로 변환합니다. 정확한 공식과 큰 값 지원. 출력: 초, 밀리초, ISO 8601, 가독 형식.

1601-01-01 UTC 이후의 100-ns 간격

현재 시간 — Windows FILETIME
Unix 타임스탬프(초)

Windows FILETIME이란?

FILETIME은 Windows API 전반에서 사용되는 타임스탬프 형식입니다. 1601년 1월 1일 00:00:00 UTC(Windows가 내부적으로 사용하는 그레고리력 주기의 시작) 이후 경과한 100나노초 간격(천만분의 1초)의 수를 세는 64비트 값입니다.

  • epoch: 1601-01-01 00:00:00 UTC
  • 해상도: 100나노초 틱(초당 10,000,000)
  • 폭: 64비트 부호 없는 정수, 흔히 두 개의 32비트 DWORD로 저장됨(dwLowDateTime, dwHighDateTime)
  • 나타나는 곳: NTFS 파일 시간, Windows 레지스트리, Active Directory(예: lastLogonTimestamp, pwdLastSet), 이벤트 로그

FILETIME을 Unix 타임스탬프로 변환하는 법

FILETIME epoch(1601)와 Unix epoch(1970) 사이에는 11,644,473,600초가 있습니다. FILETIME을 10,000,000으로 나눠 초를 구한 뒤 그 오프셋을 뺍니다.

  • Unix seconds = FILETIME / 10000000 − 11644473600
  • Unix milliseconds = FILETIME / 10000 − 11644473600000
  • 예: 133444736000000000 → 1700000000초 → 2023-11-14 22:13:20 UTC
  • 역방향: FILETIME = (Unix milliseconds + 11644473600000) × 10000

정밀도와 엣지 케이스

현재 시점의 FILETIME은 약 1.3 × 10^17로, JavaScript 숫자의 안전 정수 범위(2^53)를 초과합니다. 이 변환기는 값을 BigInt로 파싱하므로 정밀도가 손실되지 않습니다. 밀리초 미만 정밀도(마지막 네 자리)는 밀리초 Unix 타임스탬프로 변환할 때 버려집니다.

  • Active Directory는 때때로 '없음'을 의미하기 위해 0 또는 9223372036854775807을 저장함 — 실제 날짜가 아니라 센티넬임
  • FILETIME은 항상 UTC. 시간대는 결과를 표시할 때만 적용
  • 현지 시간 변형(FileTimeToLocalFileTime에서 나온 것)은 이미 오프셋을 포함함 — 먼저 UTC로 되돌릴 것

관련 타임스탬프 형식 변환기

실용적인 FILETIME 팁

실제 FILETIME 변환에서 걸려 넘어지는 몇 가지:

  • PowerShell: [DateTime]::FromFileTimeUtc($ft)는 스크립트에서의 표준 변환
  • Active Directory는 '만료되지 않음'을 의미하기 위해 상수 9223372036854775807(Int64.MaxValue)을 자주 사용 — 날짜가 아니라 센티넬로 처리
  • AD는 '설정되지 않음'을 의미하기 위해 0도 사용; 0과 Int64.MaxValue를 모두 특별히 처리
  • NTFS 파일 시간은 생성, 마지막 쓰기, 마지막 접근의 세 종류 — 모두 같은 FILETIME 형식 사용
  • FILETIME이 두 개의 32비트 DWORD로 분할된 경우, 변환 전에 (high << 32) | low로 결합

FAQ

FILETIME epoch란?
FILETIME은 1601년 1월 1일 00:00:00 UTC 이후의 100나노초 간격을 셉니다. 이는 Windows가 그레고리력에 사용하는 기준일입니다.
왜 11644473600초를 빼나?
이는 1601년 FILETIME epoch와 1970년 Unix epoch 사이의 초 수입니다. FILETIME을 10,000,000으로 나누면 1601년 이후의 초가 되고, 오프셋을 빼면 기준이 1970년으로 옮겨집니다.
두 개의 32비트 값으로 저장된 FILETIME을 변환하려면?
FILETIME = (dwHighDateTime × 4294967296) + dwLowDateTime로 결합한 뒤, 그 64비트 값을 평소대로 변환하세요.