Чому можлива дата з 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 ⨉ 365 с = 31536000 с . Це, звичайно, лише середнє значення, ігнорування високосних років, високосних секунд чи будь-яких змін у календарі, які майбутні постапокаліптичні режими можуть диктувати на решті землян.
- 9223372036854775807 ⨉ 0,0000001 с / 31536000 с ≈ 29247 років
@corsiKa
пояснює, як ми можемо відняти високосні роки: 29247/365/4 ≈ 20
- Отже ваш максимальний рік - 1601 + 29247 - 20 = 30828 .
Деякі люди насправді намагалися встановити це і придумали того ж року.