Ich versuche, den Dateibefehl zu verwenden, um einen Dateizeitstempel zu generieren, den der Dateibefehl selbst interpretieren kann. Der Befehl date scheint jedoch keine eigene Ausgabe zu mögen, und ich bin nicht sicher, wie ich das umgehen soll. Ein typisches Beispiel:
sh-4.2$ date
Fri Jan 3 14:22:19 PST 2014
sh-4.2$ date +%Y%m%dT%H%M
20140103T1422
sh-4.2$ date -d "20140103T1422"
Thu Jan 2 23:22:00 PST 2014
Das Datum scheint die Zeichenfolge mit einem Versatz von 15 Stunden zu interpretieren. Gibt es dafür bekannte Workarounds?
Bearbeiten: Dies ist kein Problem der Anzeige:
sh-4.2$ date +%s
1388791096
sh-4.2$ date +%Y%m%dT%H%M
20140103T1518
sh-4.2$ date -d 20140103T1518 +%s
1388737080
sh-4.2$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1388737080 - 1388791096
-54016
>>> 54016/3600
15.004444444444445
>>>
Bei Anzeige als Unix-Zeitstempel ist die Zeit immer noch um 15 Stunden verrutscht.
EDIT # 1
Vielleicht sollte ich diese Frage etwas anders stellen. Angenommen, ich habe eine Liste der ISO8601-Basiszeitstempel des Formulars:
- JJJJMMTThhmm
- JJJJMMTThhmmss
Was ist die einfachste Möglichkeit, sie in die entsprechenden Unix-Zeitstempel umzuwandeln?
Beispielsweise:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
quelle
20140103T1518
ist nicht gültig nach ISO 8601, ZeitzoneAntworten:
Sie fragen nach "bekannten Problemumgehungen". Hier ist eine einfache:
Dies wird verwendet
sed
, um "T" durch ein Leerzeichen zu ersetzen. Das Ergebnis ist ein Format, dasdate
versteht.Wenn wir dem ISO8601-Datum Sekunden hinzufügen,
date
sind weitere Änderungen erforderlich:sed
Ersetzt oben das "T" durch ein Leerzeichen und trennt HHMMSS ebenfalls in HH: MM: SS.quelle
Das Coreutils-Info-Dokument besagt, dass ISO 8601 "erweitertes Format" unterstützt wird.
Sie müssen Bindestriche, Doppelpunkte und ein hinzufügen,
+%z
damit es funktioniert.Um Ihren zweiten Teil der Frage zu beantworten ...
Da das Datumsformat nur Zahlen und Symbole enthält, können Sie jedes Symbol durch einen eindeutigen Buchstaben ersetzen, z. B. mit
tr
Oder Sie können es mit
T
und-
oder+
als Trennzeichen analysieren , z. B. mit Shell${var%word}
und${var#word}
Expansionoder mit
bash
regulären Ausdrücken abgleichenoder Perl, Python usw. usw.
quelle
GNU-Coreutils haben seit Version 8.13 (veröffentlicht am 08.09.2011) nur ISO 8601-Daten als Eingabe unterstützt . Sie müssen eine ältere Version verwenden.
In älteren Versionen müssen Sie das Zeichen
T
durch ein Leerzeichen ersetzen . Ansonsten wird es als Zeitzone des US-Militärs interpretiert .Selbst in neueren Versionen wird nur die vollständig unterbrochene Form erkannt, nicht das Basisformat mit nur Ziffern und einem
T
in der Mitte.quelle
Ich habe diesen Hinweis in der Manpage für bemerkt
date
.Es ist nicht schlüssig, zeigt aber nicht explizit eine Zeitformat-Zeichenfolge an, die die Zeichenfolge
T
für [ISO 8601] enthält, wie Sie es versuchen. Wie @Gilles antwortete , ist die Unterstützung von ISO 8601 in GNU CoreUtils relativ neu.Formatieren Sie die Zeichenfolge neu
Sie können Perl verwenden, um Ihre Zeichenfolge neu zu formulieren.
Beispiel:
Sie können dafür sorgen, dass sowohl Zeichenfolgen mit Sekunden als auch solche ohne Sekunden verarbeitet werden.
20140103T1422:
20140103T142233:
quelle
Gemäß der Manpage of Date stimmt das von Ihnen ausgegebene Format nicht mit dem
date
erwarteten Format für die Eingabe überein. Dies ist, was die Manpage sagt:Du könntest es also so machen:
Da in den Variablen, die zum Definieren der Ausgabezeichenfolge verwendet
+%m%d%H%M%Y
werden, gleich wäre, was es als Eingabe erwartet.quelle