Como pode um arquivo ter sido 'criado' em 1641?

74

Alguns anos atrás, tropecei neste arquivo em nosso servidor de arquivos.

E eu me pergunto como um arquivo pode dizer que foi criado em 1641? Tanto quanto eu sei, o tempo no PC é definido pelo número de segundos desde 01 de janeiro de 1970. Se esse índice falha, você pode obter 31 de dezembro de 1969 (o índice provavelmente diz -1), mas estou perplexo com isso data aparentemente aleatória, que antecede até mesmo a fundação dos Estados Unidos da América.

Então, como um arquivo pode ser datado em 1641?

PS: As datas são em francês. Février é fevereiro.

    
por Fredy31 27.03.2018 / 16:33

4 respostas

106

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.

    
por 27.03.2018 / 16:41
16

Se você não se sente muito mal com algumas suposições, deixe-me oferecer uma explicação. E eu não quero dizer "alguém definir o valor para o absurdo", isso é obviamente sempre possível:)

O tempo Unix geralmente usa o número de segundos desde 1970. O Windows, por outro lado, usa 1601 como ano inicial. Então, se assumirmos (e isso é uma suposição grande!) Que o problema é a conversão errada entre os dois tempos, podemos imaginar que a data que deveria ser representada é realmente em 2011 (1970 + 41), que foi convertido incorretamente para 1640 (1601 + 41) . EDIT: Na verdade, eu cometi um erro no ano de início do Windows. É possível que o tempo real de criação tenha sido em 2010, ou que tenha havido outro erro envolvido (erros comuns são bastante comuns no software: D).

Dado que este ano é outra das datas de rastreamento associadas ao arquivo em questão, eu acho que é uma explicação bastante plausível :)

    
por 27.03.2018 / 20:55
5

Como foi escrito por outras pessoas, a época do Windows está em 1601-01-01 00:00 .

O número de segundos entre essa época e o filetime exibido, 1,266,705,294 .
Se adicionarmos isso à época do Unix, chegaremos a 2010-02-20 23:34:54 CEST

    
por 30.03.2018 / 09:47
2

Como de costume para esses tipos de perguntas, o blog de Raymond Chen tem uma resposta a respeito disso o "Por que é a época Win32 1 de janeiro de 1601?" entrada de 6 de março de 2009:

The FILETIME structure records time in the form of 100-nanosecond intervals since January 1, 1601. Why was that date chosen?

The Gregorian calendar operates on a 400-year cycle, and 1601 is the first year of the cycle that was active at the time Windows NT was being designed. In other words, it was chosen to make the math come out nicely.

I actually have the email from Dave Cutler confirming this.

    
por 30.03.2018 / 08:12