Wie kann ich ein Datum mit einem benannten Monat nur mit Busybox-Tools in einen Unix-Zeitstempel konvertieren?

7

Ich arbeite in einer Umgebung, in der ich so gut wie nur Zugriff auf Busybox-Tools habe, und versuche, ein Datum im Format Mon Jan 1 23:59:59 2018 GMTin einen Unix-Zeitstempel in einem Shell-Skript zu konvertieren . Ich kann das Format der Eingabezeit, die ich analysiere, nicht ändern. Es scheint, dass busybox datedieses Datumsformat oder ein anderes Format mit einem benannten Monat nicht verstanden werden kann. Ich habe ein wirklich hässliches Skript, das das kann, aber weiß jemand etwas Schöneres?

Bearbeiten: Die date -DOption funktioniert bei mir nicht, verstehe ich

date: invalid option -- 'D'     
BusyBox v1.24.1 (2018-01-11 16:07:45 PST) multi-call binary.     

Usage: date [OPTIONS] [+FMT] [TIME]`
Nic
quelle
1
Mögliches Duplikat von BusyBox Date Command Set Time mit UNIX Timestamp
Jeff Schaller
1
Siehe auch: unix.stackexchange.com/a/296073/117549
Jeff Schaller
1
@JeffSchaller Nein, bei der BusyBox-Datumsbefehlssatzzeit mit UNIX-Zeitstempel wird die Computerzeit festgelegt. Die -dOption für eine Datumszeichenfolge wird nicht verwendet .
Isaac
Danke, @isaac; Ich werde meine Stimme zurückziehen, um andere nicht irrezuführen.
Jeff Schaller

Antworten:

7

Die Busybox date2 ist in der Lage, das Datum in der angegebenen Zeichenfolge mit Hilfe von 1 (mit Ausnahme der GMT-Zeitzone) vollständig zu analysieren .

$ gdate='Mon Jan 1 23:59:59 2018 GMT'
$ TZ=GMT0 busybox date -d "$gdate" -D '%a %b %d %T %Y %Z'
Mon Jan  1 23:59:59 GMT 2018

Die Hilfe wird mit der -DOption gegeben: eine Beschreibung des Quellformats.

Um einen UNIX-Zeitstempel zu erhalten, fügen Sie einfach das erwartete Ausgabeformat hinzu +'%s':

$  TZ=GMT0 busybox date -d "$gdate" -D '%a %b %d %T %Y %Z' +'%s'
1514851199

1
Die Busybox dateverfügt über die meisten Funktionen des GNU- dateBefehls und eine, die der GNU- dateBefehl nicht bietet: die -DOption. Holen Sie sich die Busybox-Hilfe wie folgt:

$ busybox date --help

BusyBox v1.27.2 (Debian 1: 1.27.2-2) Mehrfachaufruf-Binärdatei.

Verwendung: Datum [OPTIONEN] [+ FMT] [ZEIT]

Anzeigezeit (mit + FMT) oder eingestellte Zeit

    [-s,--set] TIME Set time to TIME
    -u,--utc        Work in UTC (don't convert to local time)
    -R,--rfc-2822   Output RFC-2822 compliant date string
    -I[SPEC]        Output ISO-8601 compliant date string
                    SPEC='date' (default) for date only,
                    'hours', 'minutes', or 'seconds' for date and
                    time to the indicated precision
    -r,--reference FILE     Display last modification time of FILE
    -d,--date TIME  Display TIME, not 'now'
    -D FMT          Use FMT for -d TIME conversion

Beachten Sie die -D FMTOption.


2
Beachten Sie, dass Sie die Busybox möglicherweise dateauf zwei Arten anrufen können:

$ busybox date

Oder wenn ein Link zu busyboxmit dem Namen dateim richtigen PATHVerzeichnis installiert wurde :

$ date

Um dies zu überprüfen, fragen Sie einfach nach --versionoder --helpfinden Sie heraus, welches Datum Sie installiert haben.

Mit GNU date:

$ date --version
date (GNU coreutils) 8.28

Oder (Busybox date):

$ date --help
BusyBox v1.27.2 (Debian 1:1.27.2-2) multi-call binary.
…
…
Isaac
quelle
Ich denke, ich muss eine andere Busybox-Version haben als Sie hier. Alles, was ich mit Ihrem Beispiel bekomme, ist date: invalid option -- 'D' BusyBox v1.24.1 (2018-01-11 16:07:45 PST) multi-call binary. Usage: date [OPTIONS] [+FMT] [TIME]. Es ist jedoch eine gute Antwort, ich werde es wahrscheinlich akzeptieren, wenn ich hier nichts bekomme, was für mich funktioniert.
Nic
Eigentlich bin ich mir nicht sicher, wie das überhaupt funktioniert ... Aus der Dokumentation hier Busybox.net/downloads/BusyBox.html geht hervor, dass es eine Reihe anerkannter TIME-Formate gibt, von denen keines einen benannten Monat enthält
Nic
@Nic Die Version 1.24.0 ist von Januar 2017 . Seltsam: Ich habe diese Version (Busybox-i686) von diesem Link heruntergeladen und sie hat die -D FMTOption. Außerdem (unter demselben Link) können Sie die Busybox 1.27 herunterladen . Sie hat nur eine Größe von 900 KByte.
Isaac
@Nic Beim erneuten Lesen der Dokumentation auf der Seite, auf die Sie verlinken, ist klar, dass die letzte Option ist -D FMT Use FMT for -d TIME conversion. Sie sollten es sehen können.
Isaac
Ich sehe es dort und es funktioniert auf meinem Host-Computer, aber leider funktioniert es nicht auf dem Yocto-Image, mit dem ich arbeite
Nic