Hace unos años, me topé con este archivo en nuestro servidor de archivos.
Y me pregunto cómo puede un archivo decir que se creó en 1641. Hasta donde sé, el tiempo en la PC se define por la cantidad de segundos desde el 1 de enero de 1970. Si ese índice falla, puede obtener el 31 de diciembre de 1969 (el índice probablemente dice -1) pero estoy perplejo por esto fecha aparentemente aleatoria, que es anterior incluso a la fundación de los Estados Unidos de América.
Entonces, ¿cómo podría fecharse un archivo en 1641?
PD: Las fechas son en francés. Février es febrero.
filesystems
Fredy31
fuente
fuente
clock_gettime(2)
página de manual para obtener una definición destruct timespec
, que es lo questat
usan otras llamadas del sistema para pasar marcas de tiempo entre el espacio de usuario y el núcleo. Es una estructura con untime_t
en segundos y unlong tv_nsec
nanosegundo. En los sistemas de 64 bits, ambos son de 64 bits, por lo que la marca de tiempo completa es de 128 bits (16 bytes). (Perdón por demasiados detalles, me dejé llevar.)Respuestas:
¿Por qué es posible una fecha del 1600?
Windows no almacena marcas de tiempo de modificación de archivos como lo hacen los sistemas Unix . De acuerdo con el Centro de desarrollo de Windows (énfasis mío):
Entonces, al establecer un valor incorrecto aquí, puede obtener fácilmente las fechas del 1600.
Por supuesto, otra pregunta importante es: ¿cómo se estableció este valor? ¿Cuál es la fecha real? Creo que nunca podrá averiguarlo, ya que podría haber sido simplemente un error de cálculo en el controlador del sistema de archivos. Otra respuesta supone que la fecha es en realidad una marca de tiempo de Unix interpretada como una marca de tiempo de Windows, pero en realidad se calculan en diferentes intervalos (segundos frente a nanosegundos).
¿Cómo se relaciona esto con el problema del año 2038?
El uso de un tipo de datos de 64 bits significa que Windows (en general) no se ve afectado por el problema del año 2038 que tienen los sistemas Unix tradicionales, ya que Unix inicialmente usó un número entero de 32 bits, que se desborda antes que el número entero de 64 bits que Windows tiene. (Esto es a pesar de que Unix funciona en segundos y Windows funciona en micro / nanosegundos).
Windows todavía se ve afectado cuando se utilizan programas de 32 bits que se compilaron con versiones antiguas de Visual Studio, por supuesto.
Los nuevos sistemas operativos Unix ya han ampliado el tipo de datos a 64 bits, evitando así el problema. (De hecho, dado que las marcas de tiempo Unix operan en segundos, la nueva fecha envolvente será de 292 mil millones de años a partir de ahora).
¿Cuál es la fecha máxima que se puede configurar?
Para los curiosos, aquí está cómo calcular eso:
@corsiKa
explica cómo podemos restar los años bisiestos: 29247/365/4 ≈ 20Algunas personas realmente han tratado de configurar esto y se le ocurrió el mismo año.
fuente
time_t
hay un tipo de 64 bits, por lo que es de esperar que las aplicaciones usen entime_t
lugar de un tipo entero que todavía es de 32 bits y truncaría las marcas de tiempo ... De todos modos, en caso de que alguien tuviera curiosidad sobre el estado del problema, se resuelve principalmente, excepto por el legado de 32 bits. IDK si el ARM de 32 bits seguirá siendo relevante en 2038, pero esto forzará al menos un cambio de ABI. El x86 de 32 bits ya no existe en el mundo Unix; Es solo Windows donde el código de 32 bits sigue siendo común.Si no te sientes mal por adivinar, déjame ofrecerte una explicación. Y no me refiero a "alguien establece el valor en tonterías", eso obviamente siempre es posible :)
El tiempo Unix usualmente usa la cantidad de segundos desde 1970. Windows, por otro lado, usa 1601 como año de inicio. Entonces, si suponemos (¡y eso es una gran suposición!) Que el problema es una conversión incorrecta entre las dos veces, podemos imaginar que la fecha que se suponía que estaba representada es en
algún momento en 2011 (1970 + 41), que se convirtió incorrectamente a 1640 (1601 + 41). EDITAR: En realidad, cometí un error en el año de inicio de Windows. Es posible que el tiempo de creación real fuera en 2010, o que hubiera otro error involucrado (los errores ocasionales son bastante comunes en el software: D).Dado que este año es otra de las fechas de seguimiento asociadas con el archivo en cuestión, creo que es una explicación bastante plausible :)
fuente
Como ha sido escrito por otros, la época de Windows es en 1601-01-01 00:00 .
El número de segundos entre esa época y el tiempo de archivo mostrado es 1.266.705.294 .
Si agregamos eso a la época de Unix, llegamos a 2010-02-20 23:34:54 CEST , un sábado. Esto es aproximadamente un año antes de la última fecha de acceso, lo que lo hace algo plausible. Por lo tanto, puede haber sido una marca de tiempo de Unix interpretada contra la época incorrecta.
fuente
Como es habitual para este tipo de preguntas, el blog de Raymond Chen tiene una respuesta al respecto de "¿Por qué es la época de Win32 el 1 de enero de 1601?" Entrada a partir del 6 de marzo de 2009:
fuente