Fecha de formato AAAA-MM-DD en script de shell

1112

Intenté usar $(date)en mi script de shell bash, sin embargo, quiero que la fecha YYYY-MM-DDesté en formato.
¿Cómo consigo esto?

Kapsh
fuente

Respuestas:

1832

En bash (> = 4.2) es preferible usar el formateador de fecha incorporado de printf (parte de bash) en lugar del externo date(generalmente la fecha GNU).

Como tal:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

En bash (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

Se pueden ver otros formatos de fecha disponibles desde las páginas de manual de fecha (para comando externo no específico de bash):

man date
Philip Fourie
fuente
44
En los primeros días del mes recibo "2012-07-1", que no es lo que pide el OP.
DerMike
66
Esto funciona para mi. La página del manual sugiere que el primero del mes es 01, no 1 (Ex. 2012-07-01).
Bob Kuhar
31
FECHA = $ (fecha +% d-% m-% Y ""% H:% M:% S); Lo que terminé después.
JacopKane
55
No he comprobado cuán ampliamente disponibles están estos atajos, pero en algunas distribuciones puede usarlos +%F %Tcomo atajo +%Y-%m-%d %H:%M:%S. Solo tenga en cuenta que algunos sistemas de archivos (tos ** HFS) convertirán :a a /, lo que le dará una cadena como la 2016-09-15 11/05/00cual es muy confusa.
beporter
24
La sintaxis preferida en cualquier shell compatible con POSIX en este milenio es en date=$(date)lugar de date=`date`. Además, no use mayúsculas para sus variables privadas; los nombres de variables en mayúscula están reservados para el sistema.
tripleee
335

Tratar: $(date +%F)

kwatford
fuente
12
Las páginas del manual para la fecha se lee:% F fecha completa; igual que% Y-% m-% d, por lo que esta es solo una notación más compacta para la respuesta aceptada.
Håvard Geithus
92

Puedes hacer algo como esto:

$ date +'%Y-%m-%d'
Deshacer
fuente
47

Está buscando el formato de fecha estándar ISO 8601 , por lo que si tiene una fecha GNU (o cualquier comando de fecha más moderno que 1988) simplemente haga lo siguiente:$(date -I)

Medievalista
fuente
99
Tengo una computadora Mac OS X reciente (> 1988), y date -Ino funcionó. Habiendo instalado GNU coreutils usando brew (que usa el prefijo 'g') gdate -Ifuncionó.
Joel Purra el
3
Impar. No puedo encontrar la -Iopción documentada para GNU date, aunque efectivamente parece ser equivalente a date +%F.
chepner
3
OS X es generalmente un páramo GPL v3, por lo que es posible que no tengan una fecha actualizada o BASH recientemente.
Interior
20
date -d '1 hour ago' '+%Y-%m-%d'

La salida sería 2015-06-14.

xu2mao
fuente
3
Incorrecto por un par de razones, obviamente esto da una fecha incorrecta entre 00:00 y 01:00, y además termina con un %.
Gerhard Burger
no es verdad. debería ser como esta escasa cita simple
Beyhan Gül
20
$(date +%F_%H-%M-%S)

se puede usar para eliminar dos puntos (:) entre

salida

2018-06-20_09-55-58
ahmettolga
fuente
19

Con Bash reciente (versión ≥ 4.2), puede usar el incorporado printfcon el modificador de formato %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfes mucho más rápido que dateya que es un Bash incorporado mientras que datees un comando externo.

Además, printf -v date ...es más rápido que date=$(printf ...)ya que no requiere bifurcar una subshell.

wjandrea
fuente
44
Como nota en 2019, este comando es increíblemente más rápido * que datesi lo está utilizando desde un script bash, ya que no tiene que cargar ninguna biblioteca adicional. (* Medí en mi servidor Linux una diferencia de velocidad de ~ 160x en 1000 iteraciones)
timtj
@timtj ¡Gracias por señalar eso! Agregué algunas notas sobre velocidad a la respuesta.
wjandrea
1
Desearía poder +5 por el comentario sobre printf -v dateno bifurcar una subshell. Muy buena información !!
timtj
Por lo general, uso la fecha porque también necesito aumentar algunas fechas. ¿Puede printf hacer aritmética de fechas?
Merlin
1
@Merlin no lo creo
wjandrea
8

Cada vez que tengo una tarea como esta termino volviendo a

$ man strftime

para recordarme todas las posibilidades.

arp
fuente
7

Si desea el año en un formato de dos números, como 17 en lugar de 2017, haga lo siguiente:

DATE=`date +%d-%m-%y`
Crt
fuente
6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

Aquí x es la fecha de muestra utilizada y luego el ejemplo muestra tanto el formato de los datos como la obtención de fechas 10 minutos más que la fecha actual.

ankitbaldua
fuente
6

Yo uso la siguiente formulación:

TODAY=`date -I`
echo $TODAY

Consulte la página de manual de date, hay una serie de otras opciones útiles:

man date
Luís de Sousa
fuente
5

Yo uso $(date +"%Y-%m-%d") o $(date +"%Y-%m-%d %T")con tiempo y horas.

Miguel
fuente
1

Puede establecer la fecha como variable de entorno y luego puede usarla

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

o

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
Farid Haq
fuente