Alguns anos atrás, deparei com este arquivo em nosso servidor de arquivos.
E eu me pergunto como um arquivo pode dizer que foi criado em 1641? Até onde eu sei, o tempo no pc é definido pelo número de segundos desde 1º 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é a fundação dos Estados Unidos da América.
Então, como um arquivo poderia ser datado em 1641?
PS: As datas são em francês. Février é fevereiro.
filesystems
Fredy31
fonte
fonte
clock_gettime(2)
página do manual para obter uma definição destruct timespec
qual é o questat
e outras chamadas do sistema usam para passar carimbos de data e hora entre o espaço do usuário e o kernel. É uma estrutura com umtime_t
em segundos e umlong tv_nsec
nanossegundo. Nos sistemas de 64 bits, ambos são de 64 bits, portanto, todo o registro de data e hora é de 128 bits (16 bytes). (Desculpe por muitos detalhes, eu me empolguei.)Respostas:
Por que uma data do século XVII é possível?
O Windows não armazena registros de data e hora de modificação de arquivos, como os sistemas Unix . De acordo com o Windows Dev Center (ênfase minha):
Portanto, definindo um valor errado aqui, você pode facilmente obter datas do século XVII.
Obviamente, 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 ter sido simplesmente um erro de cálculo no driver do sistema de arquivos. Outra resposta sugere que a data é realmente um carimbo de data / hora do Unix interpretado como um carimbo de data / hora do Windows, mas na verdade eles são 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 sistemas Unix tradicionais têm, pois o Unix usava inicialmente um número inteiro de 32 bits, que transborda mais cedo que o número inteiro de 64 bits que o Windows tem. (Isso ocorre apesar do Unix operar em segundos e do Windows operar em micro / nanossegundos.)
O Windows ainda é afetado ao usar programas de 32 bits que foram compilados com versões antigas do Visual Studio, é claro.
Os sistemas operacionais Unix mais recentes já expandiram o tipo de dados para 64 bits, evitando assim o problema. (De fato, como os carimbos de data e hora do Unix operam em segundos, a nova data abrangente será de 292 bilhões de anos a partir de agora.)
Qual é a data máxima que pode ser definida?
Para os curiosos - veja como calcular isso:
@corsiKa
explica como podemos subtrair anos bissextos: 29247/365/4 ≈ 20Algumas pessoas realmente tentaram definir isso e criaram o mesmo ano.
fonte
time_t
é do tipo de 64 bits, portanto, esperamos que os aplicativos usem, emtime_t
vez de um tipo inteiro que ainda seja de 32 bits e truncaria os registros de data e hora ... De qualquer forma, caso alguém tenha curiosidade sobre o status do problema, ele será resolvido, exceto pelo legado de 32 bits. IDK se o ARM de 32 bits ainda for relevante em 2038, mas isso forçará pelo menos uma alteração ABI. O x86 de 32 bits já se foi no mundo Unix; é apenas no Windows onde o código de 32 bits ainda é comum.Se você não se sentir muito mal com algumas suposições, deixe-me dar uma explicação. E não quero dizer "alguém defina o valor como um absurdo", obviamente isso é sempre possível :)
O tempo Unix geralmente usa o número de segundos desde 1970. O Windows, por outro lado, usa 1601 como o ano inicial. Portanto, se assumirmos (e isso é uma grande suposição!) Que o problema está com uma conversão incorreta entre as duas vezes, podemos imaginar que a data que deveria ser representada é realmente
em algum momento de 2011 (1970 + 41), que foi convertido incorretamente a 1640 (1601 + 41). EDIT: Na verdade, eu cometi um erro no Windows a partir do ano. É possível que o tempo real de criação tenha sido em 2010 ou que tenha ocorrido outro erro (erros de um por um são bastante comuns no software: D).Como este ano é outra das datas de rastreamento associadas ao arquivo em questão, acho que é uma explicação bastante plausível :)
fonte
Como foi escrito por outras pessoas, a época do Windows é 1601-01-01 00:00 .
O número de segundos entre a época e a hora do arquivo exibida é 1.266.705.294 .
Se adicionarmos isso à época do Unix, chegamos ao 20-02-2010 23:34:54 CEST , um sábado. Isso é cerca de um ano antes da última data de acesso, o que a torna um tanto plausível. Portanto, pode ter sido um carimbo de data / hora do Unix interpretado contra a época errada.
fonte
Como sempre, para esses tipos de perguntas, o blog de Raymond Chen tem uma resposta sobre isso em "Por que a época do Win32 é 1º de janeiro de 1601?" entrada de 6 de março de 2009:
fonte