¿Qué es la época de Unix y cuándo fue la época de Unix?

¿Por qué Unix tiene su propio concepto de tiempo? ¿Cuál es la época y cuál es el problema de Y2038?

La hora Unix es un medio para representar una fecha y hora específicas, utilizada por Linux, macOS y muchos otros sistemas interoperables. Está tan extendido que probablemente lo esté utilizando sin darse cuenta. Sin embargo, una vez que comprenda el tiempo de Unix, lo detectará en muchos contextos. Varias herramientas pueden ayudarlo a trabajar con tiempo Unix.

¿Cuál es el propósito del tiempo Unix?

El tiempo Unix es un recuento de segundos totales desde una fecha y hora fija. Es un formato de fecha / hora (o marca de tiempo) que se ve diferente de las fechas y horas legibles por humanos a las que estamos acostumbrados. Esto es puramente por razones de eficiencia. Se necesita mucho menos espacio para almacenar un solo número que representa segundos que para almacenar valores separados para el año, mes, hora, etc.

Por supuesto, en términos modernos, la diferencia de espacio no es tanta. Pero considere que Unix se originó a fines de la década de 1960 cuando el almacenamiento disponible era mucho menor. Las marcas de tiempo también se usan mucho, por lo que su almacenamiento se acumula. Por ejemplo, cada archivo tiene tres marcas de tiempo asociadas.

El formato es prácticamente imposible de traducir mentalmente a menos que sea un genio matemático. Pero todavía tiene algunas ventajas sobre alternativas más legibles, como el miércoles 21 de octubre de 2015 a las 07:28:00 GMT . Puede solicitar dos marcas de tiempo Unix muy fácilmente, de un vistazo. También suele ser más rápido calcular la diferencia entre dos marcas de tiempo. Esto es particularmente cierto para fechas cercanas, como en días adyacentes.

Sobre la Época

Entonces, el tiempo de Unix es un recuento total de segundos desde un punto específico en el tiempo. Pero, ¿cuál es ese momento? Son las 00:00:00 UTC del 1 de enero de 1970 . Esto a menudo se conoce como la época de Unix. Los programadores eligieron esta fecha para la época por conveniencia, ya que era la fecha más cercana cuando inventaron la hora Unix.

Es posible que haya visto esta fecha cuando algo salió mal. Claramente es un error, ¡pero se ve muy extraño cuando resulta en una fecha anterior a la época en que muchos de nosotros nacimos! Sin embargo, es completamente comprensible cuando conoces la época de Unix. Si algún sistema está intentando mostrar una marca de tiempo que no tiene ningún valor, a menudo se traducirá a 0 y dará como resultado la fecha de época exacta.

El formato de datos de tiempo de Unix

Estrictamente hablando, no hay ninguno. El tipo de datos original era un entero de 32 bits y, a menudo, este sigue siendo el caso, incluso en sistemas mucho más potentes.

Este tipo de datos permite que el valor almacene un total de 2 ^ 32 segundos, que es un poco más de 136 años. Este valor suele estar firmado, lo que significa que puede ser negativo o positivo. Por lo tanto, generalmente representa 68 años a cada lado de la época, es decir, 1902-2038.

Este es todavía un período limitado, por supuesto. Pero el uso principal del formato de marca de tiempo fue para conceptos como la modificación de archivos. La necesidad era mucho de representar el tiempo cercano al presente, en lugar de la historia antigua o el futuro lejano. Incluso para aplicaciones como calendarios, rara vez es necesario representar fechas de más de unas pocas décadas en el futuro.

Pero eso no significa que este período de tiempo limitado no tenga problemas …

El problema del año 2038

El error Y2K ( uno de los peores errores de programación de la historia ) afectó a los sistemas informáticos que almacenaban años como valores de dos dígitos. Cuando llegó el año 2000, dichos sistemas lo trataron como si fuera 1900. En realidad, esto no fue tan catastrófico como se temía, principalmente porque muchas personas dedicaron mucho tiempo y esfuerzo a prepararse para ello.

Si prestaste atención en la sección anterior, es posible que hayas detectado un problema similar que podría afectar la hora de Unix. Bueno, la hora de Unix tiene un problema de datos propio: el problema Y2k38. (A menudo se lo denomina un problema, no un error; ¡quizás nos hemos vuelto más optimistas desde el año 2000!) Cuando el tiempo de Unix literalmente se agote en 2038, los sistemas tratarán las nuevas fechas como 1902 o 1970. O posiblemente ' Simplemente fallaré por completo.

Al menos este problema no nos golpeará al filo de la medianoche de la víspera de Año Nuevo. El último segundo del tiempo Unix de 32 bits caerá el 19 de marzo. En la eventualidad, es probable que actualice la mayoría de los sistemas para el 2038 o estarán obsoletos para entonces de todos modos.

Algunos recursos útiles sobre marcas de tiempo

El sitio de Epoch Converter es posiblemente el conversor de marcas de tiempo más completo disponible. Comienza mostrando la hora actual de Unix, en tiempo real, y agrega casi todas las funciones imaginables además de eso. Su uso principal es para convertir entre marcas de tiempo y fechas legibles por humanos, en ambas direcciones.

Dan's Tools es una gran colección de aplicaciones web útiles, una de las cuales es un convertidor de marca de tiempo . Es más básico, pero tiene una presentación muy limpia y es fácil de usar.

Time.is presenta otro look aún más minimalista. Muestra la hora en varios formatos, incluida la hora Unix. Incluye la hora actual en el título de su página, lo cual es útil.

Uso de Unix Time con herramientas de línea de comandos

En Linux y macOS, el programa de fecha es la utilidad principal para manejar la fecha / hora, incluidas las marcas de tiempo de Unix. Llamado sin ningún argumento, devuelve la fecha / hora actual en un formato legible por humanos:

 $ date
Wed Feb 10 12:28:30 GMT 2021

Si necesita la fecha / hora actual en tiempo Unix, use el argumento +% s :

 $ date +%s
1612960114

Puede convertir una fecha legible por humanos en una marca de tiempo usando la marca -d si su versión de la fecha lo admite. La mayoría de las versiones de Linux deberían, por defecto:

 $ date -d "Jan 2 1970" +%s
82800

En macOS, date es un programa diferente, que requiere un conjunto diferente de indicadores:

 $ date -j -f "%b %d %Y %T" "Jan 02 1970 00:00:00" "+%s"
82800

Yendo en la otra dirección, puede convertir desde una marca de tiempo Unix usando la bandera -r :

 $ date -r 1600000000
Sun 13 Sep 2020 13:26:40 BST

Algunos otros programas usan el formato % s para lidiar con la hora Unix. Por ejemplo, si desea mostrar la fecha de modificación de un archivo en tiempo Unix, con la versión de Linux de ls , puede usar lo siguiente:

 $ ls -l --time-style=+%s index.tmp.html
-rw-r--r-- 1 ubuntu ubuntu 17862 1521649818 index.tmp.html

Cómo usar Unix Time en lenguajes de programación

PHP tiene la función time () que devuelve la marca de tiempo actual de Unix. Su función date () toma una marca de tiempo como segundo argumento:

 $ php -r 'echo date("Ymd", time());'
2021-02-11

JavaScript aborda las cosas de una manera interesante. Tiene un método Date.now () para obtener el número de milisegundos desde la época de Unix. Por supuesto, puede dividir esto por 1,000 y redondear el resultado para obtener el tiempo Unix equivalente en segundos:

 > Math.floor(Date.now() / 1000)
1613083012

Entendiendo la hora de Unix

El tiempo Unix es un concepto simple que surge en muchos lugares. Una vez que lo entienda, puede que le resulte bastante útil, por ejemplo, al calcular las diferencias horarias. También puede reconocer cuándo puede ser la causa de ciertos errores.

Conceptos como la época y las marcas de tiempo son una parte importante para comenzar con Linux. Para obtener más información sobre elementos esenciales como ls , consulte nuestra guía de comandos básicos de Linux.