¿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):
Un tiempo de archivo es un valor de 64 bits que representa el número de intervalos de 100 nanosegundos que han transcurrido desde las 12:00 a.m. del 1 de enero de 1601, hora universal coordinada (UTC). El sistema registra los tiempos de archivo cuando las aplicaciones crean, acceden y escriben en archivos.
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:
- El número de valores posibles en un entero de 64 bits son 2 63 - 1 = 9223372036854775807 .
- Cada marca representa 100 nanosegundos, que es 0.1 µs o 0.0000001 s.
- El rango de tiempo máximo sería 9223372036854775807 ⨉ 0.0000001 s , por lo que cientos de miles de millones de segundos.
- Una hora tiene 3600 segundos, un día tiene 86400 segundos y un año tiene 365 días, por lo que hay 86400 ⨉ 365 s = 31536000 s en un año. Esto es, por supuesto, solo un promedio, ignorando los años bisiestos, los segundos bisiestos o cualquier cambio de calendario que los futuros regímenes postapocalípticos puedan dictar sobre los terrícolas restantes.
- 9223372036854775807 ⨉ 0.0000001 s / 31536000 s ≈ 29247 años
@corsiKa
explica cómo podemos restar los años bisiestos: 29247/365/4 ≈ 20
- Entonces su año máximo es 1601 + 29247 - 20 = 30828 .
Algunas personas realmente han tratado de configurar esto y se le ocurrió el mismo año.