Дата и время · форматы датFILETIME в дату и метки Active Directory
FILETIME — 18-значное число сотен наносекунд от 1 января 1601 года. Так Windows хранит время файлов, а Active Directory — lastLogonTimestamp, pwdLastSet и accountExpires. Вставьте число, шестнадцатеричное значение или пару dwHigh/dwLow — получите дату в UTC с полной точностью.
Считается в браузере — значения никуда не отправляются
FILETIME — 64-битное целое: сколько интервалов по 100 наносекунд прошло с полуночи 1 января 1601 года по UTC. Год выбран как начало 400-летнего цикла григорианского календаря — так проще считать високосные годы.
То же число лежит в атрибутах Active Directory: lastLogonTimestamp, pwdLastSet, badPasswordTime, accountExpires. В выводе Get-ADUser и в ADSI Edit оно выглядит как 18 цифр, в отладчике — как 0x01DC…, а в структуре Win32 — как пара dwHighDateTime и dwLowDateTime.
Два значения — не даты. 0 означает «не задано» (pwdLastSet = 0 — сменить пароль при входе), а 9223372036854775807 в accountExpires — «никогда не истекает». Перевод их в 1601 или 30828 год — частая ошибка скриптов.
Разбор по частям134355024000000000
134355024000000000
сотни наносекунд от 1601-01-01 00:00 UTC — 3 октября 2026, 12:00
÷ 10 000 000
секунды от 1601 года
− 11 644 473 600
секунды между 1601 и 1970 годами — дальше это Unix-время
Как сделать то же самое
[DateTime]::FromFileTimeUtc(134355024000000000)PowerShell и .NET: число → дата в UTC
(Get-Date).ToFileTimeUtc()PowerShell: текущий момент → FILETIME
w32tm /ntte 134355024000000000командная строка Windows: число → дата
03
Как это выглядит
значения, которые встречаются на практике
Значение
Что это
0
не задано
116444736000000000
1970-01-01 00:00:00 UTC
125911584000000000
2000-01-01 00:00:00 UTC
134355024000000000
2026-10-03 12:00:00 UTC
0x01DD532EB74F2000
2026-10-03 12:00:00 UTC
9223372036854775807
никогда не истекает
04
Частые ошибки
Число делят на 1000, как Unix-миллисекунды, — выходит дата в далёком будущем. FILETIME считается в сотнях наносекунд: делить нужно на 10 000 000 и вычитать 11 644 473 600 секунд.
lastLogon и lastLogonTimestamp — не одно и то же: первый не реплицируется и на каждом контроллере свой, второй реплицируется, но обновляется с задержкой до 14 дней. Для «кто не входил месяц» берут lastLogonTimestamp.
Время в FILETIME — UTC. Если показать его как местное без перевода, вход «в 9 утра» у сотрудника в Москве окажется в 6 утра.
05
Частые вопросы
Вставьте 18-значное число из атрибута в поле на этой странице — появится дата в UTC и по Москве. В PowerShell то же делает [DateTime]::FromFileTimeUtc(значение), а Get-ADUser с параметром -Properties LastLogonDate отдаёт уже готовую дату. Помните, что атрибут обновляется с задержкой до двух недель, поэтому он годится для поиска давно не входивших, а не для точного времени входа.
Способ, которым Windows хранит моменты времени: 64-битное целое число интервалов по 100 наносекунд, прошедших с полуночи 1 января 1601 года по UTC. Так записаны время создания и изменения файлов, события журналов и метки Active Directory. Число обычно 18-значное; в структуре Win32 оно разбито на две 32-битные половины — dwHighDateTime и dwLowDateTime.
lastLogon обновляется при каждом входе, но только на том контроллере домена, который проверил пароль, и между контроллерами не реплицируется: чтобы узнать последний вход, нужно опросить все. lastLogonTimestamp реплицируется по всему домену, зато обновляется не чаще раза в 9–14 дней. Для отчёта «кто не входил больше месяца» удобнее второй, для точного времени — первый.
Ноль в pwdLastSet — не дата, а флаг: пользователь обязан сменить пароль при следующем входе. Его ставит галочка «Требовать смены пароля при следующем входе в систему». Обратная операция — записать -1: тогда домен подставит текущее время, и требование снимется. Переводить ноль в дату бессмысленно — получится 1 января 1601 года.
Учётная запись не истекает никогда. Это максимальное 64-битное значение со знаком, 0x7FFFFFFFFFFFFFFF, и Active Directory использует его как «нет срока». Ноль в accountExpires означает то же самое. Если скрипт переводит это число в дату буквально, получается 30828 год — частая причина странных отчётов о сроках действия учётных записей.
Вычтите 116444736000000000 — число сотен наносекунд между 1601 и 1970 годами — и разделите на 10 000 000: получатся Unix-секунды. Для миллисекунд делите на 10 000. Обратно: умножьте Unix-секунды на 10 000 000 и прибавьте ту же константу. В JavaScript и других языках, где обычные числа не держат 18 цифр точно, считайте в BigInt или decimal.