Почему возможно свидание с 1600-х годов?
Windows не хранит метки времени изменения файлов, как в системах Unix. По данным Windows Dev Center (выделено мое):
Время файла - это 64-разрядное значение, представляющее число интервалов в 100 наносекунд , прошедших с 12:00 1 января 1601 года. Всемирное координированное время (UTC). Система записывает время файлов, когда приложения создают, получают доступ и записывают в файлы.
Таким образом, установив неправильное значение здесь, вы можете легко получить даты 1600-х годов.
Конечно, еще один важный вопрос: как было установлено это значение? Какая фактическая дата? Я думаю, вы никогда не сможете это выяснить, поскольку это могло быть просто ошибкой вычисления в драйвере файловой системы. Другой ответ предполагает, что дата на самом деле является меткой времени Unix, интерпретируемой как метка времени Windows, но на самом деле они рассчитываются на разных интервалах (секунды против наносекунд).
Как это связано с проблемой 2038 года?
Использование 64-битного типа данных означает, что Windows (как правило) не подвержена проблеме 2038 года, которая существует в традиционных системах Unix, поскольку Unix изначально использовала 32-битное целое число, которое переполняется раньше, чем 64-битное целое число, которое Windows есть. (Это несмотря на то, что Unix работает за секунды, а Windows - за микро / наносекунды.)
Конечно, Windows по-прежнему подвержена влиянию 32-битных программ, скомпилированных со старыми версиями Visual Studio.
Более новые операционные системы Unix уже расширили тип данных до 64 бит, что позволило избежать этой проблемы. (Фактически, поскольку временные метки Unix работают в секундах, новая дата оборота будет через 292 миллиарда лет.)
Какую максимальную дату можно установить?
Для любопытных - вот как это вычислить:
- Число возможных значений в 64-разрядном целом числе : 2 63 - 1 = 9223372036854775807.
- Каждый тик представляет 100 наносекунд, что составляет 0,1 мкс или 0,0000001 с.
- Максимальный диапазон времени будет 9223372036854775807 ⨉ 0,0000001 с, то есть сотни миллиардов секунд.
- Один час имеет 3600 секунд, один день имеет 86400 секунд, а один год имеет 365 дней, поэтому в году 86400 00 365 с = 31536000 с. Это, конечно, только среднее значение, игнорируя високосные годы, високосные секунды или любые изменения в календаре, которые будущие постапокалиптические режимы могут диктовать оставшимся землянам.
- 9223372036854775807 ⨉ 0,0000001 с / 31536000 с ≈ 29247 лет
@corsiKa
объясняет, как мы можем вычесть високосные годы: 29247/365/4 ≈ 20
- Таким образом, ваш максимальный год составляет 1601 + 29247 - 20 = 30828.
Некоторые люди действительно пытались установить это и придумали тот же год.