Der Befehl `date` unter OS X hat keine ISO 8601` -I` Option?

193

In einem Bash-Skript möchte ich die aktuelle Datumszeit im ISO 8601- Format (vorzugsweise UTC) drucken , und es scheint, dass dies so einfach sein sollte wie date -I:

http://ss64.com/bash/date.html

Aber das scheint auf meinem Mac nicht zu funktionieren:

$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

Und in der Tat man datelistet diese Option nicht auf.

Weiß jemand, warum dies oder eine andere (einfache) Möglichkeit für mich ist, das Datum im ISO 8601-Format zu drucken? Vielen Dank!

Aseem Kishore
quelle
2
Zur Verdeutlichung möchte ich ein vollständiges ISO 8601-Datum, einschließlich der Uhrzeit, und vorzugsweise in der UTC-Zeitzone.
Aseem Kishore
Es ist besser, nur die Frage zu bearbeiten. In welchem ​​Format soll die Zeit sein?
Tom Zych
@ Tom: Okay, bearbeitet. Ist ISO 8601 nach Format nicht spezifisch genug?
Aseem Kishore
Nein, ISO 8601 ist nicht spezifisch genug. Dieser Standard spezifiziert eine Reihe von Formaten mit verschiedenen Genauigkeiten. Beide 2011-08-27und 2011-08-27T18:55:43Zsind ISO 8601-Formate. In der Tat wäre das Bearbeiten der Frage hilfreicher als das Scannen von Updates über mehrere Kommentare hinweg. Ein Beispiel für das, was Sie drucken möchten, wäre ideal.
Keith Thompson
6
Die Installation von GNU-Coreutils mit brew(das Präfix 'g' verwendet) gdate -Ihat zusammen mit anderen GNU-Flags funktioniert.
Joel Purra

Antworten:

348

Du könntest benutzen

date "+%Y-%m-%d"

Verwenden Sie für ein vollständig ISO-8601-konformes Datum eines der folgenden Formate:

date -u +"%Y-%m-%dT%H:%M:%SZ"

Ausgabe:

2011-08-27T23:22:37Z

oder

date +%Y-%m-%dT%H:%M:%S%z

Ausgabe:

2011-08-27T15:22:37-0800
amit_g
quelle
7
Technisch wird das "T" empfohlen, ist jedoch in ISO 8601 optional. Die Verwendung eines Leerzeichens anstelle von "T" wäre: Datum -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque
Schließlich! Ich habe dies zu meinem bash_alias hinzugefügt
Christian Bongiorno
Ja, tolle Antwort Danke!, Aber date -u +"%Y-%m-%dT%H:%MZ"genau das habe ich gesucht.
ChikuMiku
3
@mbigras: Zund +00:00sind die gleichen (meistens). Zum Zwecke der Zeitübersetzung bedeuten beide UTC. England ist jedoch +00:00im Winter und +01:00im Sommer (BST).
Jeffrey Hulten
5
@ JeffreyHulten: "beide bedeuten UTC" - Nitpick, ist aber ZUTC, während +00:00GMT ist. UTC ist keine Zeitzone und hat keinen Offset. Offset ist definiert als die Zeitdifferenz zwischen einer Zeitzone und UTC, dem Standard der Zeitmessung. GMT ist +00: 00 von UTC entfernt (und BST ist, wie Sie sagen, +01: 00 von UTC entfernt).
Amadan
57

In GNU Datum date -Iist das gleiche wie date +%Fund -Isecondsund -Iminutesauch Zeit ist mit UTC - Offset.

$ date +%F # -I or +%Y-%m-%d
2013-05-03
$ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z
2013-05-03T15:59:24+0300
$ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z
2013-05-03T15:59+0300

-uist wie TZ=UTC. +00:00kann durch ersetzt werden Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

Dies sind auch gültige Datums- oder Zeitformate nach ISO 8601:

20130503T15 (%Y%m%dT%M)
2013-05 (%Y%m)
2013-W18 (%Y-W%V)
2013-W18-5 (%Y-W%V-%u)
2013W185 (%YW%V%u)
2013-123 (%Y-%j, ordinal date)
2013 (%Y)
1559 (%H%M)
15 (%H)
15:59:24+03 (UTC offset doesn't have to include minutes)

Diese sind nicht:

2013-05-03 15:59 (T is required in the extended format)
201305 (it could be confused with the YYMMDD format)
20130503T15:59 (basic and exteded formats can't be mixed)
Lri
quelle
3
Hurra für + "% FT% T% z" das ist genau das, was ich brauchte
Noah Yetter
22

Eine kurze Alternative, die sowohl am GNU- als auch am BSD-Datum funktioniert, ist:

date -u +%FT%T%z
Irgendein Typ
quelle
7
oder date -u +%FT%TZweil in UTC Offset sowieso Null wäre
akostadinov
15

Das Coreutils-Paket enthält GNU-Versionen von Tools. Installieren:

$ brew install coreutils

Sie können sehen, was bereitgestellt wird:

$ brew list coreutils

Beachten Sie, dass es mit Datum kommt:

$ brew list coreutils | grep date

Dies ist der Standard-GNU-Datumsbefehl, daher wird der Schalter -I benötigt:

$ gdate -I
2016-08-09
slm
quelle
1
Oder gdate --iso-8601=ns:: 2016-09-29T16: 54: 23,485230000 + 02: 00
Olivier
5

Verwenden Sie einfach normale dateFormatierungsoptionen:

date '+%Y-%m-%d'

Bearbeiten: Um Zeit und UTC einzuschließen, sind diese äquivalent:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
Tom Zych
quelle
Meinem OP wurde ein Kommentar hinzugefügt, der klarstellt, dass ich das vollständige Datum einschließlich der Uhrzeit und vorzugsweise in der UTC-Zeitzone haben möchte. Danke für den Tipp!
Aseem Kishore
3

Es ist kein Feature von Bash, es ist ein Feature der dateBinärdatei. Unter Linux haben Sie normalerweise die GNU Coreutils-Version von date, während Sie unter OSX die BSD-Legacy-Dienstprogramme haben. Die GNU-Version kann sicherlich als optionales Paket installiert werden, oder Sie können Ihren eigenen Ersatz rollen - ich glaube, es sollte ein einfacher Einzeiler sein, z. B. in Perl.

Tripleee
quelle
Interessant, danke. Ich bin eine Art Mac / Linux / Unix / Bash Noob; Würde es Ihnen etwas ausmachen, auf Coreutils einzugehen und wie man es auf einem Mac installiert? Vielen Dank!
Aseem Kishore
2

Wenn Sie die anderen Antworten noch einen Schritt weiter gehen, können Sie Ihrem ~ / .bashrc oder ~ / .zshrc eine Funktion hinzufügen, um das Datumsflag hinzuzufügen -I:

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}
ruby_slinger
quelle