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 --datela %scadena 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 --datey -doption esperan la fecha en formato de EE. UU. O ISO8601, es decir , mm/dd/yyyyo yyyy-mm-ddno en el Reino Unido, la UE o cualquier otro formato.
+"%s"significa formato de salida y%ses 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:sseche un vistazo a gnu.org/software/coreutils/manual/html_node/… :gdate --date='2019-06-18 00:02:00 +0000' +%sPara 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
-ubandera debería arreglar eso.-ubandera debe ir antes de la-fbandera, 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" +%sMuchas 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
datecomo 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 $nowDebe 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.096sy:
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
datesolo 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 userdatePodrí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 $start1O usa mi
newConnectorfunciónCon funciones para la conexión
MySQL/MariaDB,PostgreSQLySQLite...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 1514804400Nota: 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
-ubandera. De lo contrario, lo convierte de su zona horaria local.date -u -d "$datetime" +"%s" #general output = "1339485682"fuente
dateformatea correctamente esta entrada.