Too Cool for Internet Explorer

16 marzo 2006

El mundo se acaba el 19 de enero de 2038...

... exactamente el martes 19 de enero de 2038 a las 3 y 14 minutos y 7 segundos de la mañana. A esa hora, cual Marty McFly, regresaremos al pasado, en concreto, al viernes 13 de Diciembre de 1901, a las 8 y 45 minutos y 52 segundos de la tarde.

Por lo menos, esto pasará en los sistemas Unix de 32 bits. Y todo es debido a que se utiliza una rutina que calcula el número de segundos (representado en un binario de 32 dígitos) y se los suma a la fecha esa de 1901 (¿?... ¿Quién puso la fecha? si Unix se creó en los años 60....). Efectivamente, cuando tengamos 32 unos en ese binario, habrán pasado 4294967296 segundos, y al sumarle uno, en vez de pasar al 4294967297 segundo... volveremos a 0... Espero que en ese momento, este bug se haya solucionado, o por lo menos, que yo tenga una máquina de 64 bits xD (en las cuales no existe este problema).

Podéis comprobarlo vosotros mismos pegando este sencillo código escrito en perl:

#!/usr/bin/perl
#
# I've seen a few versions of this algorithm
# online, I don't know who to credit. I assume
# this code to by GPL unless proven otherwise.
# Comments provided by William Porquet, February 2004.
# You may need to change the line above to
# reflect the location of your Perl binary
# (e.g. "#!/usr/local/bin/perl").
# Also change this file's name to '2038.pl'.
# Don't forget to make this file +x with "chmod".
# On Linux, you can run this from a command line like this:
# ./2038.pl
use POSIX;
# Use POSIX (Portable Operating System Interface),
# a set of standard operating system interfaces.
$ENV{'TZ'} = "GMT";
# Set the Time Zone to GMT (Greenwich Mean Time) for date calculations.
for ($clock = 2147483641; $clock < 2147483651; $clock++)
{
print ctime($clock);
}
# Count up in seconds of Epoch time just before and after the critical event.
# Print out the corresponding date in Gregrorian calendar for each result.
# Are the date and time outputs correct after the critical event second?

grabadlo como 2038.pl (por ejemplo), ponedle atributos de ejecución (chmod +x 2038.pl) y ejecutadlo (./2038.pl)

Salu2.