Was ist ein Standardbefehl zum Drucken eines Datums im RFC-3339-Format?

Der Befehl date bietet so etwas nicht an, was irgendwie traurig ist, da RFC-3339 das ist Modernes, weit verbreitetes, vernünftiges Format, das überall verwendet wird (außer in E-Mails, die weder modern noch vernünftig sind).

Mein Zeitzonenversatz beträgt derzeit -08: 00, daher sollte die einfachste Form dieses Befehls die aktuelle Zeit als 2013-09-05T14:58:33.102-08:00.

Kommentare

  • Welche Standards interessieren Sie? in?
  • Ich persönlich bin mit GNU in Ordnung, aber im großen Schema der Dinge sollte es wirklich breiter sein. Es sollte auch mit einem vernünftigen Standard (kurze Option, Millisekundengenauigkeit) kommen und einen Weg dazu haben Geben Sie die Genauigkeit in Sekunden an (Anzahl der Ziffern außer 0 oder 9).
  • Es ‚ ist kein normales Format: die Summe Das Fehlen von Leerzeichen erschwert das Lesen für Menschen unnötig. Sie sollten die geringfügige Abweichung 2013-09-05 14:58:33.102 -0800 verwenden, außer wenn i Dies ist ein Grund, warum Leerzeichen überhaupt nicht verwendet werden dürfen.
  • Ich habe es mit dem Mail-Datumsformat (RFC 822, 2822) verglichen, das sowohl für Menschen als auch für Maschinen schwer zu lesen ist.

/ ul>

Antwort

Es scheint, dass Sie mit dem Wechsel zur GNU-Implementierung von date (Version 5.90 oder höher), --rfc3339=.

Beispiele

$ date --rfc-3339=date 2014-03-19 $ date --rfc-3339=seconds 2014-03-19 18:00:05-04:00 $ date --rfc-3339=ns 2014-03-19 18:00:08.179780629-04:00 

Wenn Sie möchten, dass die T als Hack hinzugefügt wird:

$ date --rfc-3339=seconds | sed "s/ /T/" 2014-03-19T18:35:03-04:00 

Wenn Sie dies in Millisekunden wünschen :

$ date --rfc-3339=ns | sed "s/ /T/; s/\(\....\).*\([+-]\)/\1\2/g" 2014-03-19T18:42:52.362-04:00 

Referenzen

Kommentare

  • Heutzutage ist kein Hack erforderlich, um die ‚ T ‚. Die --iso-8601' option accepts the same arguments as –rfc-3339` und enthält die ‚ T ‚ in ihrer Ausgabe.
  • Sed Teil s/\(\....\).*-/\1-/g sollte s/\(\....\).*\([+-]\)/\1\2/g sein, um auch östlich des Atlantiks zu arbeiten.
  • @svante – danke für das Detail, behoben.
  • @Eonil, das eigentlich nicht korrekt ist, der RFC3339 besagt: NOTE: ISO 8601 defines date and time separated by "T". Während RFC3339 die Verwendung von a ermöglicht Platz stattdessen. Lesen Sie ietf.org/rfc/rfc3339.txt Abschnitt 5.6
  • @ rwenz3l Meine Schuld. Ich habe gerade nur den ABNF-Teil gelesen und die Notizen verpasst. Vielen Dank für den Hinweis!

Antwort

Mit GNU date (5.90 oder höher):

$ TZ=America/Anchorage date "+%FT%T.%N%:z" 2014-03-19T14:29:31.041119357-08:00 

Ersetzen Sie %N durch %3N für Millisekunden, %6N für Mikrosekunden …

AFAIK, keine der POSIX-, Unix- oder LSB-Spezifikationen gibt einen Befehl an, mit dem Zeiten angezeigt werden können Granularität in Sekundenbruchteilen, aber der Bruchteil ist in RFC 3339 optional.

POSIX / Unix / LSB-Strftime unterstützt %z, um den TZ-Offset als -0800, also ist das tragbarste, das Sie wahrscheinlich bekommen werden:

 $ TZ=America/Anchorage perl -MPOSIX -le "$t = strftime "%Y-%m-%dT%T%z", localtime; $t =~ s/..$/:$&/; print $t" 2014-03-19T14:30:23-08:00 

Antwort

Sie können die Zeit auch gemäß RFC3339 (ISO8601) einfacher formatieren:

 $ date -u +"%Y-%m-%dT%H:%M:%SZ" 2016-11-08T08:52:55Z  

HINWEIS: Dieses Formular at wird auch in der Beschriftungsschema-Konvention RC 1.0

Kommentare

  • verwendet Das ‚ ist kein gültiger RFC3339. Eran ‚ s Antwort von „ `Datum +% Y-% m-% dT% T% z` „ ist korrekt und weniger Zeichen. Wenn Sie das UTC-Pass -u-Flag verwenden möchten, wird der Zeitzonenversatz auf Null gesetzt.
  • Mit dem -u -Flag ist diese Antwort richtig, oder?
  • @briceburg warum ist dieser RFC3339 nicht gültig? Laut tools.ietf.org/html/rfc3339#section-5.6 scheint es, soweit ich das beurteilen kann, richtig zu sein.

Antwort

GNU date hat das ISO-8601-Format eingebaut – ist das nicht ziemlich nah oder sogar identisch mit RFC-3339?

1065 % date --iso-8601=seconds 2014-03-19T16:51:16-0600 

Kommentare

  • ISO-8601 erlaubt unterschiedliche Formatierungen von Datums- und Uhrzeitangaben, aber ich denke, das OP fragt speziell nach dem W3C-Datumsformat “ Vollständiges Datum plus Stunden, Minuten, Sekunden und a Dezimalbruch einer Sekunde JJJJ-MM-TTThh: mm: ss.sTZD (z. B. 1997-07-16T19: 20: 30.45 + 01: 00) “ W3C-Datums- und Uhrzeitformate .

Antwort

Wie wäre es mit guten alten:

$ date +%Y-%m-%dT%T%z 2015-10-29T14:47:06+0200 

Kommentare

  • Wo sind die Zeitzoneninformationen?
  • Dies funktioniert sowohl unter Mac als auch unter Linux. ‚ Datum ‚
  • Wie wäre es mit Millisekunden?
  • Kurzer Hinweis: Ohne den RFC zu öffnen, fehlt dem Zeitzonensegment 0200 ein Doppelpunkt, wodurch einige Systeme beschädigt werden können, die dies erfordern.
  • @MikeMackintosh ‚ Hinweis ist relevant; Die hier gezeigte Ausgabe ist kein gesetzliches RFC 3339-Datum. Der Doppelpunkt im Zeitzonensegment wird für RFC 3339 benötigt. Siehe die Definition von time-numoffset unter tools.ietf.org/html/rfc3339#section-5.6 .

Antwort

echo "Local date only:" date "+%Y-%m-%d" echo echo "Local date and time:" date "+%Y-%m-%dT%H:%M:%S%z" | sed "s@^.\{22\}@&:@" echo echo "UTC date and time:" date -u "+%Y-%m-%dT%H:%M:%SZ" 

Diese Befehle sind mit Ausnahme von POSIX-kompatibel der Konvertierungsspezifikation %z. %z wird jedoch weitgehend unterstützt und funktioniert unter Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix und Haiku auf die gleiche Weise. Es funktioniert auch mit den Tools in Busybox, Toybox und sbase (den Dienstprogrammen des Basissystems sauglos.org). Da %z den Zeitzonenversatz im Format ±HHMM ausgibt, benötigen wir zum Hinzufügen die Pipe sed einen Doppelpunkt und ändern Sie ihn in ±HH:MM.

HINWEIS: Der Befehl date des Heirloom-Projekts hat ompatibel %z Ausgabe: Es wird kein + -Zeichen gedruckt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.