it-swarm.com.de

Konvertieren Sie die Datumszeitzeichenfolge in Epoche in Bash

Die Datumszeitzeichenfolge hat das folgende Format: 12.06.2012 07:21:22. Wie kann ich es in UNIX-Zeitstempel oder Epoche konvertieren?

60
Edward D.

Was Sie suchen, ist date --date='06/12/2012 07:21:22' +"%s". Beachten Sie, dass Sie davon ausgehen, dass Sie GNU coreutils verwenden, da sowohl --date als auch die %s-Formatzeichenfolge die Erweiterung GNU sind. POSIX gibt keine der beiden an, daher gibt es auch auf POSIX-kompatiblen Systemen keine tragbare Möglichkeit, eine solche Konvertierung durchzuführen.

Weitere Versionen von date finden Sie in der entsprechenden Handbuchseite.

Hinweis: Die Option bash --date und -d erwartet das Datum im US- oder ISO8601-Format, d. H. mm/dd/yyyy oder yyyy-mm-dd, nicht in UK, EU oder einem anderen Format.

65

Für Linux Führen Sie diesen Befehl aus

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

Führen Sie diesen Befehl für Mac OSX aus

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

Viele dieser Antworten sind zu kompliziert und es fehlt auch die Verwendung von Variablen. So würden Sie es auf einem Standard-Linux-System einfacher tun (wie zuvor erwähnt, müsste der Date-Befehl für Mac-Benutzer angepasst werden):

Beispielskript:

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

Ergebnisse in:

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

Oder als Funktion:

# -- 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

Konvertieren Sie die Datumszeitzeichenfolge in den UNIX-Zeitstempel im Befehl bash

Da Daniel Kamil Kozar richtig geantwortet hat, ist datedas Rechte Werkzeug.

Ich möchte nur eine bestimmte Art der Verwendung hinzufügen, meistens, wenn Sie

Anstatt 1 Fork nach Datum zum Konvertieren auszuführen, führen Sie date nur einmal aus und führen alle Konvertierungen mit demselben Prozess durch (dies könnte viel schneller werden) !:

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

Probe:

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

Dann schau doch mal:

declare -p start1 start2 dirchg userdate

(kann etwas antworten wie: 

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

Verwendung von long running subprozess

Wir brauchen nur ein fifo:

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

(Hinweis: Wenn der Prozess ausgeführt wird und alle Deskriptoren geöffnet sind, können wir das Dateisystem von fifo sicher entfernen.)

Dann jetzt:

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

Wir könnten eine kleine Funktion aufbauen:

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

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

Oder verwenden Sie die Funktion meinenewConnector

Sie können sie in einer anderen Version auf GitHub oder auf my site finden.

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