Perché è possibile una data del 1600?
Windows non memorizza i timestamp di modifica dei file come fanno i sistemi Unix . Secondo Windows Dev Center (l'enfasi è mia):
Un tempo di file è un valore a 64 bit che rappresenta il numero di intervalli di 100 nanosecondi che sono trascorsi dalle 12:00 AM 1 gennaio 1601 Coordinated Universal Time (UTC). Il sistema registra i tempi dei file quando le applicazioni creano, accedono e scrivono nei file.
Quindi, impostando un valore errato qui, puoi facilmente ottenere date dal 1600.
Naturalmente, un'altra domanda importante è: come è stato impostato questo valore? Qual è la data effettiva? Penso che non sarai mai in grado di scoprirlo, dato che avrebbe potuto essere semplicemente un errore di calcolo nel driver del file system. Un'altra risposta ipotizza che la data sia in realtà un timestamp Unix interpretato come un timestamp di Windows, ma in realtà sono calcolati su intervalli diversi (secondi vs nanosecondi).
In che modo ciò si collega al problema dell'anno 2038?
L'uso di un tipo di dati a 64 bit significa che Windows (in genere) non è interessato dal problema dell'anno 2038 che i sistemi Unix tradizionali hanno, poiché Unix inizialmente utilizzava un numero intero a 32 bit, che trabocca prima dell'intero a 64 bit che Windows ha. (Questo nonostante Unix operi in pochi secondi e Windows operi in micro / nanosecondi.)
Windows è ancora interessato quando si usano programmi a 32 bit che sono stati compilati con le vecchie versioni di Visual Studio, ovviamente.
I sistemi operativi Unix più recenti hanno già esteso il tipo di dati a 64 bit, evitando così il problema. (Infatti, poiché i timestamp di Unix funzionano in pochi secondi, la nuova data avvolgente sarà tra 292 miliardi di anni.)
Qual è la data massima che può essere impostata?
Per i curiosi: ecco come calcolarlo:
- Il numero di valori possibili in un numero intero a 64 bit è 2 63 - 1 = 9223372036854775807 .
- Ogni segno di spunta rappresenta 100 nanosecondi, ovvero 0,1 µs o 0,0000001 s.
- L'intervallo di tempo massimo sarebbe 9223372036854775807 ⨉ 0,0000001 s , quindi centinaia di miliardi di secondi.
- Un'ora ha 3600 secondi, un giorno ha 86400 secondi e un anno ha 365 giorni, quindi ci sono 86400 ⨉ 365 s = 31536000 s in un anno. Questo è, ovviamente, solo una media, ignorando gli anni bisestili, i secondi bisestili o qualsiasi modifica del calendario che i futuri regimi postpocalittici potrebbero imporre sui restanti terrestri.
- 9223372036854775807 ⨉ 0,0000001 s / 31536000 s ≈ 29247 anni
@corsiKa
spiega come possiamo sottrarre anni bisestili: 29247/365/4 ≈ 20
- Quindi il tuo anno massimo è 1601 + 29247-20 = 30828 .
Alcune persone hanno effettivamente cercato di impostare questo e hanno escogitato lo stesso anno.