"date" | Comando consola de Linux
1. Información general
Cuando trabajamos en la línea de comandos de Linux o escribimos scripts de shell, a menudo necesitamos manejar valores de fecha y hora, como generar una fecha en los formatos requeridos, obtener una fecha y hora relativa o cambiar la fecha y hora del sistema.
2. Introducción al comando de fecha
El comando de fecha está preinstalado de forma predeterminada en todas las distribuciones de Linux, ya que forma parte del paquete GNU coreutils .
La sintaxis para usar el comando de fecha es:
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Si no damos ninguna opción, el comando de fecha imprimirá la fecha y hora actual del sistema, incluido el día de la semana, mes, hora, año y zona horaria:
$ date
Sat 21 Mar 2020 08:51:23 PM CET
Sin embargo, si pasamos opciones diferentes, el comando de fecha puede hacer más que eso.
Algunos usos comunes del comando de fecha son:
- mostrar la fecha y hora actuales de una zona horaria determinada.
- mostrar la fecha y la hora en el formato requerido.
- mostrar la fecha y hora de una cadena determinada.
- obtener una fecha y hora relativas.
- establecer la fecha y hora del sistema.
Repasemos algunos ejemplos para aprender cómo manejar cada uno de ellos.
3. Anular la zona horaria
3.1. Mostrar fecha y hora en UTC
El comando de fecha generará la fecha y la hora en la zona horaria definida en nuestro sistema.
UTC es una zona horaria especial. El comando de fecha admite la opción -u para mostrar la fecha y hora en UTC :
$ date -u
Sat 21 Mar 2020 08:51:03 PM UTC
3.2. Mostrar fecha y hora en otra zona horaria
El comando de fecha utilizará de forma predeterminada la zona horaria definida por /etc/localtime . El archivo /etc/localtime suele ser un enlace simbólico que apunta a un archivo de zona horaria:
$ readlink /etc/localtime
/usr/share/zoneinfo/Europe/Berlin
A veces queremos saber la fecha y la hora en otra zona horaria. Podemos configurar la variable de entorno TZ para anular la configuración de zona horaria para el comando de fecha:
$ date
Sat 21 Mar 2020 10:07:37 PM CET
$ TZ="EST" date
Sat 21 Mar 2020 04:07:42 PM EST
Podemos asignar a la variable TZ una abreviatura de zona horaria , como EST en el ejemplo anterior, o un nombre en la base de datos de zona horaria :
$ TZ="Asia/Tokyo" date
Sun 22 Mar 2020 06:07:55 AM JST
La variable de entorno modificada TZ es solo para el siguiente comando de fecha , la zona horaria del sistema conserva el valor original :
$ date
Sat 21 Mar 2020 10:09:10 PM CET
4. Mostrar fecha y hora en varios formatos
4.1. Mostrar fecha y hora en formatos admitidos
El comando de fecha admite muchas opciones de formato de visualización. Podemos pasar un formato requerido hasta la fecha :
date "+FORMATS"
Veamos un par de ejemplos de cómo cambiar el formato de fecha:
$ date '+Current Date: %F%nCurrent Time: %H:%M:%S'
Current Date: 2020-03-21
Current Time: 22:23:03
$ date '+Today is %A, the %wth day in the week %W.%nUnix timestamp for now: %s'
Today is Saturday, the 6th day in the week 11.
Unix timestamp for now: 1584826306
Algunos formatos comúnmente utilizados son:
%A : nombre completo del día de la semana de la configuración regional (por ejemplo, domingo )
%D – fecha; igual que %m/%d/%y
%F – fecha completa; como %+4Y-%m-%d
%s – segundos desde 1970-01-01 00:00:00 UTC
%y – últimos dos dígitos del año ( 00..99 )
%Y – año (por ejemplo, 2020)
%Z : abreviatura alfabética de zona horaria (por ejemplo, EST )
%N – nanosegundos
Podemos encontrar la lista completa de secuencias de formatos compatibles en la página de manual o en la salida de date –help.
4.2. Mostrar fecha y hora en milisegundos
De forma predeterminada, el comando de fecha no admite mostrar una fecha y hora en milisegundos. Sin embargo, el comando de fecha admite el formato de nanosegundos %N . Por ejemplo, podemos obtener los nanosegundos de la hora actual:
$ date +"%N"
696644200
Si redondeamos los nanosegundos a los primeros tres dígitos, tendremos los milisegundos:
$ date +"%3N"
658
Podemos combinar el formato “%3N” con otros formatos para mostrar una fecha y hora en milisegundos.
Consigamos los milisegundos desde 1970-01-01 00:00:00 UTC:
$ date +"%s%3N"
1601496351755
También podemos mostrar la fecha y hora actuales en milisegundos:
$ date +"%F %T.%3N"
2020-09-30 22:07:30.450
5. Mostrar la fecha de una cadena determinada
Podemos pasar un valor de cadena de fecha u hora estático junto con la opción -d al comando de fecha y dejar que analice e imprima la fecha y la hora en el formato requerido.
Por ejemplo, podemos pasar una cadena de fecha para indicar 18 de noviembre de 1976 18:18:18 al comando de fecha de varias maneras:
$ date -d'1976-11-18 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'11/18/1976 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'18 Nov 1976 18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'19761118T18:18:18'
Thu 18 Nov 1976 06:18:18 PM CET
$ date -d'@217185498'
Thu 18 Nov 1976 06:18:18 PM CET
En los ejemplos anteriores, vemos que el patrón de cadena de fecha admitido por el comando de fecha es bastante flexible. Puede ser una marca de tiempo Unix después de @ , un formato de fecha ISO o incluso una cadena de fecha legible por humanos.
6. Obtener fecha y hora relativas
En la sección anterior, vimos cuán flexible puede ser la cadena de fecha para la opción -d . En esta sección, continuaremos usando -d'dateString' para permitir que el comando de fecha calcule una fecha y hora relativas en el pasado o en el futuro.
En esta sección, todos los ejemplos de cálculo de fecha relativa se basarán en la fecha y hora actuales:
$ date
Sun 22 Mar 2020 11:27:41 PM CET
6.1. ayer y mañana
Comencemos por obtener un día antes y después de la fecha actual. Es bastante sencillo, simplemente pasamos ayer y mañana con la opción -d:
$ date -d'yesterday'
Sat 21 Mar 2020 11:30:32 PM CET
$ date -d'tomorrow'
Mon 23 Mar 2020 11:30:37 PM CET
6.2. siguiente, hace y último
Pasar ayer o mañana con la opción -d nos resulta útil para obtener un solo día antes y después de la fecha base.
Pero ¿qué pasa si queremos obtener un número arbitrario de días antes y después? ¿O incluso en otras unidades, como semanas, meses, años, etc.?
Las expresiones next , ago y last pueden ayudarnos con eso:
$ date -d'3 days ago'
Thu 19 Mar 2020 11:40:14 PM CET
$ date -d'next 2 month'
Thu 23 May 2020 12:40:23 AM CET
$ date -d'last week'
Sun 15 Mar 2020 11:40:29 PM CET
$ date -d'next wed'
Wed 25 Mar 2020 12:00:00 AM CET
$ date -d'last Sunday'
Sun 15 Mar 2020 12:00:00 AM CET
6.3. +x y -x
Además de esas cadenas de fechas legibles por humanos, como siguiente y último, también podemos pasar un número con una unidad a la opción -d. Un número positivo obtendrá una fecha y hora en el futuro, mientras que un número negativo indica una fecha y hora en el pasado:
$ date -d'+7 day'
Mon 30 Mar 2020 12:54:43 AM CET
$ date -d'-3 year'
Wed 22 Mar 2017 11:54:51 PM CET
$ date -d'10 week'
Mon 01 Jun 2020 12:55:08 AM CET
De esta manera resulta fácil calcular la fecha y hora relativa mediante programación, por ejemplo, en un script de shell.
6.4. Obtener fecha y hora relativas según una fecha determinada
Hasta ahora, hemos visto algunos ejemplos de cómo obtener una fecha y hora relativas basadas en la fecha y hora actual. También funcionarán para una cadena de fechas determinada.
Veamos algunos ejemplos de cómo obtener fecha y hora relativa según 1976-11-18:
$ date -d'19761118 -3 days'
Mon 15 Nov 1976 12:00:00 AM CET
$ date -d'19761118 last year'
Tue 18 Nov 1975 12:00:00 AM CET
$ date -d'19761118 tomorrow'
Fri 19 Nov 1976 12:00:00 AM CET
$ date -d'19761118 2 month ago'
Sat 18 Sep 1976 12:00:00 AM CET
7. Cambiar la hora del sistema
Podemos usar el comando de fecha con la opción -s para cambiar el reloj del sistema manualmente. Dado que cambiar la hora del sistema afectará los programas en ejecución actuales, solo el usuario root puede realizar ese cambio.
Por ejemplo, el siguiente comando configurará la hora de nuestro sistema en 1976-11-18 18:18:18:
root# date -s "1976-11-18 18:18:18"
8. Conclusión
El comando de fecha es una utilidad muy conveniente para manejar valores de fecha y hora.
Fuente: https://www.baeldung.com/linux/date-command
Comenten! Respondo preguntas...
ResponderEliminar