La cadena de fecha y hora tiene el siguiente formato: 12/06/2012 07:21:22. ¿Cómo puedo convertirlo a marca de tiempo o época de UNIX?
95
Lo que estás buscando es date --date='06/12/2012 07:21:22' +"%s"
. Tenga en cuenta que esto supone que está usando GNU coreutils, ya que tanto --date
la %s
cadena de formato como la cadena de formato son extensiones GNU. POSIX no especifica ninguno de esos, por lo que no existe una forma portátil de realizar dicha conversión incluso en sistemas compatibles con POSIX.
Consulte la página de manual correspondiente para otras versiones de date
.
Nota: bash --date
y -d
option esperan la fecha en formato de EE. UU. O ISO8601, es decir , mm/dd/yyyy
o yyyy-mm-dd
no en el Reino Unido, la UE o cualquier otro formato.
+"%s"
significa formato de salida y%s
es el formato de tiempo en segundos desde 1970date --date='06/12/2012 07:21:22 -0000' +"%s"
convierte la fecha UTC en una marca de tiempo Unixyyyy-mm-dd hh:mm:ss
eche un vistazo a gnu.org/software/coreutils/manual/html_node/… :gdate --date='2019-06-18 00:02:00 +0000' +%s
Para Linux Ejecute este comando
date -d '06/12/2012 07:21:22' +"%s"
Para mac OSX, ejecute este comando
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
fuente
-u
bandera debería arreglar eso.-u
bandera debe ir antes de la-f
bandera, o de lo contrario el shell lo interpreta como la cadena de formato. Por lo tanto, debería ser:date -j -u -f "%a..."
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
Muchas de estas respuestas son demasiado complicadas y también les falta cómo usar las 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):
Ejemplo de guion:
#!/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:
O en 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 }
fuente
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 }
fuente
Solución eficiente utilizando
date
como fondo dedicado proceso dePara hacer este tipo de traducción mucho más rápido ...
Intro
En esta publicación, encontrará
bc
,rot13
,sed
...).Demo rápida
fifo=$HOME/.fifoDate-$$ mkfifo $fifo exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1) echo now 1>&5 exec 6< $fifo rm $fifo read -t 1 -u 6 now echo $now
Debe generar la corriente UNIXTIME . A partir de ahí, podrías comparar
time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done real 0m0.298s user 0m0.132s sys 0m0.096s
y:
time for i in {1..5000};do ans=$(date +%s -d "now");done real 0m6.826s user 0m0.256s sys 0m1.364s
¡¡De más de 6 segundos a menos de medio segundo !! (en mi anfitrión).
Podrías verificar
echo $ans
, reemplazar"now"
por"2019-25-12 20:10:00"
etc.Opcionalmente, podría, una vez finalizado el requisito de fecha del subproceso :
exec 5>&- ; exec 6<&-
Publicación original (explicación detallada)
En lugar de ejecutar 1 bifurcación por fecha para convertir, ejecute
date
solo 1 vez y realice todas las conversiones con el mismo proceso (¡esto podría ser mucho más rápido) !: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 eche un vistazo:
declare -p start1 start2 dirchg userdate
¡Esto se hizo en una sola ejecución!
Usando subprocesos de larga ejecución
Solo necesitamos un quince :
mkfifo /tmp/myDateFifo exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo) exec 8</tmp/myDateFifo rm /tmp/myDateFifo
(Nota: como el proceso se está ejecutando y todos los descriptores están abiertos, podríamos 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
newConnector
funciónCon funciones para la conexión
MySQL/MariaDB
,PostgreSQL
ySQLite
...Puede encontrarlos en diferentes versiones en GitHub o en mi sitio: descargar o mostrar .
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
Nota: En GitHub , las funciones y la prueba son archivos separados. En mi sitio, las pruebas se ejecutan simplemente si este script no se obtiene .
# Exit here if script is sourced [ "$0" = "$BASH_SOURCE" ] || { true;return 0;}
fuente
Solo asegúrate de qué zona horaria quieres usar.
datetime="06/12/2012 07:21:22"
El uso más popular toma la zona horaria de la máquina.
date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"
Pero en caso de que intencionalmente desee pasar la fecha y hora UTC y desee la zona horaria adecuada, debe agregar una
-u
bandera. De lo contrario, lo convierte de su zona horaria local.date -u -d "$datetime" +"%s" #general output = "1339485682"
fuente
date
formatea correctamente esta entrada.