now - Convertir cadena de fecha y hora a época en Bash
printf date bash (5)
La cadena de fecha y hora está en el siguiente formato: 06/12/2012 07:21:22. ¿Cómo puedo convertirlo a UNIX timestamp o epoch?
Convierta la cadena de fecha y hora a la marca de hora de UNIX en el comando bash
Como Daniel Kamil Kozar respondió correctamente, la date
es la herramienta correcta.
Solo quiero agregar una forma particular de usarlos, sobre todo si tienes muchas fechas para convertir:
En lugar de ejecutar 1 fork por fecha para convertir, ejecuta la date
solo 1 vez y realiza todas las conversiones con el mismo proceso (¡esto podría ser mucho más rápido) !:
date -f - +%s <<eof
Apr 17 2014
May 21 2012
Mar 8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140
Muestra:
start1=$(LANG=C ps ho lstart 1)
start2=$(LANG=C ps ho lstart $$)
dirchg=$(LANG=C date -r .)
read -p "A date: " userdate
{ read start1 ; read start2 ; read dirchg ; read userdate ;} < <(
date -f - +%s <<<"$start1"$''/n''"$start2"$''/n''"$dirchg"$''/n''"$userdate" )
Entonces ahora mira:
declare -p start1 start2 dirchg userdate
(puede responder algo como:
declare -- start1="1518549549" declare -- start2="1520183716" declare -- dirchg="1520601919" declare -- userdate="1397685600"
Usando el subproceso de larga ejecución
Solo necesitamos una fifo :
mkfifo /tmp/myDateFifo
exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo)
exec 8</tmp/myDateFifo
rm /tmp/myDateFifo
(Nota: A medida que se ejecuta el proceso y se abren todos los descriptores, podemos eliminar de forma segura la entrada del sistema de archivos de fifo).
Entonces ahora:
LANG=C ps ho lstart 1 $$ >&7
read -u 8 start1
read -u 8 start2
LANG=C date -r . >&7
read -u 8 dirchg
read -p "Some date: " userdate
echo >&7 $userdate
read -u 8 userdate
Podríamos construir una pequeña función:
mydate() {
local var=$1;
shift;
echo >&7 $@
read -u 8 $var
}
mydate start1 $(LANG=C ps ho lstart 1)
echo $start1
O usa mi función newConnector
Puede encontrarlos en versiones diferentes en GitHub , o en mi sitio .
wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash
. shell_connector.bash
newConnector /bin/date ''-f - +%s'' @0 0
myDate "2018-1-1 12:00" test
echo $test
1514804400
Muchas de estas respuestas son demasiado complicadas y tampoco se sabe cómo usar variables. Así es como lo haría de manera más simple en un sistema Linux estándar (como se mencionó anteriormente, el comando de fecha debería ajustarse para los usuarios de Mac):
Secuencia de comandos de muestra:
#!/bin/bash
orig="Apr 28 07:50:01"
epoch=$(date -d "${orig}" +"%s")
epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S)
echo "RESULTS:"
echo "original = $orig"
echo "epoch conv = $epoch"
echo "epoch to human readable time stamp = $epoch_to_date"
Resultados en:
RESULTS:
original = Apr 28 07:50:01
epoch conv = 1524916201
epoch to human readable time stamp = 20180428_075001
O como una función:
# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human.
# typeset now=$(date +"%s")
# typeset now_human_date=$(convert_cron_time "human" "$now")
function convert_cron_time() {
case "${1,,}" in
epoch)
# human to epoch (eg. "Apr 28 07:50:01" to 1524916201)
echo $(date -d "${2}" +"%s")
;;
human)
# epoch to human (eg. 1524916201 to "Apr 28 07:50:01")
echo $(date -d "@${2}" +"%b %d %H:%M:%S")
;;
esac
}
Para Linux, ejecute este comando
date -d ''06/12/2012 07:21:22'' +"%s"
Para mac OSX ejecuta este comando
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
Lo que estás buscando es date --date=''06/12/2012 07:21:22'' +"%s"
. Tenga en cuenta que esto supone que está utilizando coreutils de GNU, ya que ambos --date
y la cadena de formato %s
son extensiones de GNU. POSIX no especifica ninguno de estos, por lo que no existe una forma portátil de realizar dicha conversión incluso en sistemas que cumplen con POSIX.
Consulte la página del manual correspondiente para conocer otras versiones de la date
.
Nota: las --date
bash --date
y -d
esperan la fecha en formato US o ISO8601, es decir, mm/dd/yyyy
o yyyy-mm-dd
, no en el Reino Unido, la UE ni en ningún otro formato.
get_curr_date () {
# get unix time
DATE=$(date +%s)
echo "DATE_CURR : "$DATE
}
conv_utime_hread () {
# convert unix time to human readable format
DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S)
echo "DATE_HREAD : "$DATE_HREAD
}