web-dev-qa-db-fra.com

Convertir une chaîne de date/heure en Epoch dans Bash

La chaîne de date et heure est au format suivant: 06/12/2012 07:21:22. Comment puis-je le convertir en horodatage ou époque UNIX?

60
Edward D.

Ce que vous cherchez, c'est date --date='06/12/2012 07:21:22' +"%s". N'oubliez pas que cela suppose que vous utilisez GNU coreutils, étant donné que --date et la chaîne de formatage %s sont des extensions GNU. POSIX ne spécifiant aucun de ces éléments, il n’existe donc aucun moyen portable de procéder à cette conversion, même sur des systèmes compatibles POSIX.

Consultez la page de manuel appropriée pour connaître les autres versions de date.

Remarque: Les options bascode --date et -d prévoient que la date est au format US ou ISO 8601, c'est-à-dire mm/dd/yyyy ou yyyy-mm-dd, pas au Royaume-Uni, dans l'UE ou dans tout autre format.

65
Daniel Kamil Kozar

Pour Linux Exécutez cette commande

date -d '06/12/2012 07:21:22' +"%s"

Pour mac OSX, lancez cette commande

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
31
Abdul Rehman Janjua

Beaucoup de ces réponses sont trop compliquées et manquent également d’utilisation des variables. Voici comment procéder plus simplement sur un système Linux standard (comme mentionné précédemment, la commande de date devra être ajustée pour les utilisateurs Mac):

Exemple de script:

#!/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"

Résulte en :

RESULTS:
original = Apr 28 07:50:01
Epoch conv = 1524916201 
Epoch to human readable time stamp = 20180428_075001

Ou en fonction:

# -- 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
}
3
Mike Q
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
}
1
shgurbanov

Convertir la chaîne de date/heure en horodatage UNIX dans la commande bash

Lorsque Daniel Kamil Kozar } _ a correctement répondu, date est l'outil

Je veux juste ajouter une façon particulière de les utiliser, surtout si vous avez plusieurs date à convertir:

Au lieu d'exécuter 1 fork par date à convertir, exécutez date une seule fois et effectuez toutes les conversions avec le même processus (cela pourrait devenir beaucoup plus rapide)!

date -f - +%s <<eof
Apr 17  2014
May 21  2012
Mar  8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140

Échantillon:

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" )

Alors maintenant, regardez:

declare -p start1 start2 dirchg userdate

(peut répondre à quelque chose comme: 

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"

Utilisation du sous-processus long

Nous avons juste besoin d'un fifo:

mkfifo /tmp/myDateFifo
exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo)
exec 8</tmp/myDateFifo
rm /tmp/myDateFifo

(Remarque: lorsque le processus est en cours et que tous les descripteurs sont ouverts, nous pouvons supprimer en toute sécurité l'entrée du système de fichiers de fifo.)

Alors maintenant:

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

Nous pourrions construire une petite fonction:

mydate() {
    local var=$1;
    shift;
    echo >&7 $@
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1

Ou utilisez ma fonctionnewConnector

Vous pouvez les trouver dans des versions différentes sur GitHub , ou sur mon site .

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
0
F. Hauri