Por que uma data dos anos 1600 é possível?
O Windows não armazena os registros de data e hora de modificação do arquivo como os sistemas Unix . De acordo com o Centro de Desenvolvimento do Windows (o meu é ):
A file time is a 64-bit value that represents the number of 100-nanosecond intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal Time (UTC). The system records file times when applications create, access, and write to files.
Então, definindo um valor errado aqui, você pode facilmente obter datas a partir de 1600.
Claro, outra questão importante é: como esse valor foi definido? Qual é a data real? Eu acho que você nunca será capaz de descobrir, pois isso poderia simplesmente ter sido um erro de cálculo no driver do sistema de arquivos. Outra resposta é a hipótese de que a data é, na verdade, um timestamp Unix interpretado como um registro de data e hora do Windows, mas eles são, na verdade, calculados em intervalos diferentes (segundos vs. nanossegundos).
Como isso se relaciona com o problema do ano 2038?
O uso de um tipo de dados de 64 bits significa que o Windows (geralmente) não é afetado pelo Problema do ano 2038 que os tradicionais sistemas Unix têm, desde que o Unix inicialmente usou um inteiro de 32 bits, que estourou mais cedo do que o inteiro de 64 bits que o Windows possui. (Isso ocorre apesar do Unix estar operando em segundos e do Windows operando em micro / nanossegundos.)
O Windows ainda é afetado ao usar programas de 32 bits que foram compilados com versões antigas do Visual Studio, é claro.
Novos sistemas operacionais Unix já expandiram o tipo de dados para 64 bits, evitando assim o problema. (Na verdade, como os timestamps do Unix operam em segundos, a nova data de abrangência será de 292 bilhões de anos a partir de agora.)
Qual é a data máxima que pode ser definida?
Para os mais curiosos - veja como calcular isso:
- O número de valores possíveis em um inteiro de 64 bits é 2 63 - 1 = 9223372036854775807 .
- Cada escala representa 100 nanossegundos, ou seja, 0,1 µs ou 0,0000001 s.
- O intervalo máximo de tempo seria 9223372036854775807 ⨉ 0,0000001 s , então centenas de bilhões de segundos.
- Uma hora tem 3600 segundos, um dia tem 86400 segundos e um ano tem 365 dias, então há 86400 ⨉ 365 s = 31536000 s em um ano. Esta é, naturalmente, apenas uma média, ignorando anos bissextos, segundos bissextos ou quaisquer mudanças no calendário que os futuros regimes pós-apocalípticos possam ditar nos terráqueos remanescentes.
- 9223372036854775807 ⨉ 0,0000001 s / 31536000 s ≈ 29247 anos
-
@corsiKa
explica como podemos subtrair anos bissextos: 29247/365/4 ≈ 20 - Portanto, seu ano máximo é 1601 + 29247 - 20 = 30828 .
Algumas pessoas tentaram definir isso e apareceram no mesmo ano.