Як може бути створений файл у 1641 році?


75

Кілька років тому я натрапив на цей файл на нашому файловому сервері.

Знімок екрана діалогового вікна властивостей файлів у Microsoft Windows

І мені цікаво, як файл може сказати, що він створений у 1641 році? Наскільки я знаю, час на ПК визначається кількістю секунд з 1 січня 1970 року. Якщо цей індекс вичерпається, ви можете отримати 31 грудня 1969 року (індекс, мабуть, говорить -1), але я натрапив на це здавалося б випадкова дата, яка передувала навіть заснуванню Сполучених Штатів Америки.

То як же файл може бути датований 1641 р.?

PS: Дати є французькою мовою. Фев’єр - лютий.


29
"Наскільки мені відомо, час на ПК визначається кількістю секунд з 1 січня 1970 року." - Навіть для систем, де вони є, дати до 1970 року легко представити, зробивши це число (відоме як часова мітка Unix ) негативним. Наприклад, час Unix -1000000000 відповідає 1938-04-24 22:33:20.
marcelm

1
@marcelm Так, але мінімально можлива дата є в 1901 році через обмежений діапазон 32-бітних цілих чисел.
slhck

14
@slhck: Я думаю, що marcelm передбачав 64-бітну часову позначку, адже саме для цього використовуються поточні файлові системи Unix / Linux, ядра та програмне забезпечення в просторі користувачів. Див. Розділ clock_gettime(2)man для визначення того struct timespec, що саме statта інші системні виклики використовують для передачі часових міток між простором користувача та ядром. Це структура з time_tсекундами та long tv_nsecнаносекундами. У 64-бітних системах обидві - 64-бітні, тому вся часова марка становить 128 біт (16 байт). (Вибачте за занадто багато деталей, я захопився.)
Пітер Кордес

3
Ви отримали хорошу відповідь про те, як дата в 1600-х роках може бути відбита на файл, тепер саме час задуматися, як це сталося. Я б дуже уважно переглянув вміст цього wp-файлу, щоб побачити, що можна було додати, як це може пролити світло на те, як це сталося. Я б подивився на встановлені плагіни і перевірив, що жоден не є тінистим. Я думаю, що щось модифікував цей файл і намагався вручну відштампувати змінені / створені дати, щоб приховати, що файл був змінений, але вказаний час Unix замість часу Windows.
Томас Карлайл

2
Король Людовик XIII Праведний демонстрував прихильність королівської лінії до PHP?
Джессі Слікер

Відповіді:


106

Чому можлива дата з 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 .

Деякі люди насправді намагалися встановити це і придумали того ж року.


7
Для запису, Unix (або принаймні Linux) вже вирішив проблему 2038 для ядра / файлових систем у 64-розрядних архітектурах, де time_t64-бітний тип, тому, сподіваємось, додатки використовують time_tзамість цілого типу, який досі 32-бітний і урізає часові позначки ... У будь-якому разі, якщо хтось цікавиться статусом проблеми, вона здебільшого вирішується за винятком застарілих 32-бітних. IDK, якщо 32-бітний ARM все ще буде актуальним у 2038 році, але це змусить принаймні зміни ABI. 32-розрядний x86 майже не залишився у світі Unix; це лише Windows, де 32-розрядний код все ще поширений.
Пітер Кордес

Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Подорожник Geek

1
Час VMS - це " 64-бітове значення, яке представляє кількість інтервалів 100 наносекунд, що минули з " 17 листопада-1858 року. :)
RonJohn

Рік 30к - це напрочуд низько
Джон Дворак

2
@DonaldDuck blogs.msdn.microsoft.com/oldnewthing/20090306-00/?p=18913 і близько 1600 людей все ще використовували календар Юліану, роблячи подання будь-якої дати до цього складніше.
Мацей П'єхотка

16

Якщо ви не дуже погано ставитесь до здогадок, дозвольте запропонувати пояснення. І я не маю на увазі "хтось встановив значення дурниці", це очевидно завжди можливо :)

Час Unix зазвичай використовує кількість секунд з 1970 року. Windows, з іншого боку, використовує 1601 як свій початковий рік. Отже, якщо припустити (і це велике припущення!), Що проблема неправильна конверсія між двома разів, ми можемо уявити, що дата, яка повинна була бути представлена ​​насправді десь у 2011 році (1970 + 41), яка неправильно перетворена до 1640 р. (1601 + 41) . EDIT: Насправді я помилився в Windows році. Можливо, що фактичний час створення був у 2010 році, або що була інша помилка (окремі помилки досить поширені в програмному забезпеченні: D).

Зважаючи на те, що цей рік є ще однією з дат відстеження, пов’язаних із відповідним файлом, я думаю, що це досить правдоподібне пояснення :)


Так може бути, що дата була написана в Unix, але читається в UTC?
Fredy31

Windows використовує 1601, а не 1600.
Joey

3
Кілька проблем з цією теорією: згідно з екраном екрана, файл був би створений через 11 днів після його останнього доступу. Також часові позначки Windows рахуються в 100 наносекунд, а час UNIX - в секундах.
Нолонар

2
@Joey Ugh, моя помилка. Це робить пристосування набагато гіршим, ніж на перший погляд :) Я думаю, що та ж базова ідея все ж має працювати, але, мабуть, більше помилок, ніж я припускав. Або, звичайно, файл створений у 2010 році, а не у 2011 р.
Луаан

2
Секунди між епохою Windows та вказаною датою / часом файлу - 1.266.705.294 . Якщо додати його до епохи Unix, це призведе до 2010-02-20 23:34:54 CEST , що було суботою.
SQB

5

Як уже писали інші, епоха Windows знаходиться в 1601-01-01 00:00 .

Кількість секунд між цією епохою та відображеним віком часу становить 1.266.705.294 .
Якщо додати це до епохи Unix, ми приїжджаємо в 2010-02-20 23:34:54 CEST , субота. Це за рік до останньої дати доступу, що робить його дещо правдоподібним. Тож, можливо, часова марка Unix трактувалася проти неправильної епохи.


Як не дивно, епоха .NET - 0001-01-01 00:00 UTC (що на 1600 років раніше). Дивіться msdn.microsoft.com/en-us/library/…
Nayuki

2

Як зазвичай для таких типів питань, у блозі Реймонда Чена є відповідь щодо цього з "Чому епоха Win32 1 січня 1601 року?" запис від 6 березня 2009 року:

FILETIMEСтруктура записує час у вигляді 100-наносекундних інтервалів з 1 січня 1601. Чому ця дата обрана?

Григоріанський календар працює за 400-річним циклом, і 1601 - це перший рік циклу, який діяв на той час, коли Windows NT розроблявся. Іншими словами, було обрано, щоб математика вийшла красивою.

У мене фактично є повідомлення від Дейва Катлера, що підтверджує це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.