Cosè un comando standard per stampare una data nel formato RFC-3339?

Il comando date non offre nulla di simile, il che è piuttosto triste dato che RFC-3339 è il formato moderno, diffuso e sensato utilizzato ovunque (eccetto nelle email che non è né moderno né sano).

Il mio offset di fuso orario è attualmente -08: 00, quindi la forma più semplice di questo comando dovrebbe stampare lora corrente come 2013-09-05T14:58:33.102-08:00.

Commenti

  • Quali standard sei interessato in?
  • Personalmente sto bene con GNU ma nel grande schema delle cose dovrebbe essere più ampio di così. Dovrebbe anche avere un valore predefinito ragionevole (opzione breve, precisione al millisecondo) e avere un modo per specificare la precisione al di sotto del secondo (numero di cifre diverso da 0 o 9).
  • non è un formato corretto: il totale lassenza di spazi bianchi rende inutilmente difficile la lettura per gli esseri umani. Dovresti usare la leggera variazione 2013-09-05 14:58:33.102 -0800 tranne quando È un motivo per cui gli spazi non devono essere affatto utilizzati.
  • Lo stavo confrontando con il formato della data della posta (RFC 822, 2822) che è difficile da leggere sia per gli esseri umani che per le macchine.

Risposta

Sembra che tu possa fare diversi formati usando il passaggio allimplementazione GNU di date (versione 5.90 o successiva), --rfc3339=.

Esempi

$ 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 

Se desideri che T venga aggiunto, come hack:

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

Se lo desideri in millisecondi :

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

Riferimenti

Commenti

  • Oggigiorno non è necessario alcun hack per ottenere il ‘ T ‘. --iso-8601' option accepts the same arguments as –rfc-3339` e include ‘ T ‘ nel suo output.
  • La parte Sed s/\(\....\).*-/\1-/g deve essere s/\(\....\).*\([+-]\)/\1\2/g per funzionare anche a est dellAtlantico.
  • @svante – grazie per il dettaglio, corretto.
  • @Eonil che in realtà non è corretto, lRFC3339 afferma: NOTE: ISO 8601 defines date and time separated by "T". Mentre RFC3339 ti consente di utilizzare un spazio invece. Leggi la ietf.org/rfc/rfc3339.txt Sezione 5.6
  • @ rwenz3l Colpa mia. Ho appena letto solo la parte ABNF e ho perso le note. Grazie per averlo fatto notare!

Rispondi

Con GNU date (5.90 o superiore):

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

Sostituisci %N con %3N per millisecondi, %6N per micro-secondi …

AFAIK, nessuna delle specifiche POSIX, Unix o LSB specifica alcun comando che può visualizzare i tempi con granularità inferiore al secondo, ma la parte frazionaria è facoltativa in RFC 3339.

POSIX / Unix / LSB strftime supporta %z per visualizzare loffset TZ come -0800, quindi il più portatile che probabilmente otterrai è:

 $ 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 

Risposta

Puoi anche formattare lora in base a RFC3339 (ISO8601) più semplice:

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

NOTA: Questo modulo at è utilizzato anche nella Convenzione sullo schema delle etichette RC 1.0

Commenti

  • Questo ‘ non è un RFC3339 valido. La risposta di Eran ‘ di “ data +% Y-% m-% dT% T% z “ è corretta e contiene meno caratteri. Se vuoi passare il flag UTC -u, che azzererà lo scostamento del fuso orario.
  • Con il flag -u questa risposta è corretta, giusto?
  • @briceburg perché non è valido RFC3339? Secondo tools.ietf.org/html/rfc3339#section-5.6 sembra essere corretto per quanto ne so.

Risposta

GNU date ha il formato ISO-8601 integrato – non è questo abbastanza vicino o addirittura identico a RFC-3339?

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

Commenti

  • ISO-8601 consente diversi formattazioni di date e ore, ma penso che lOP chieda specificamente il formato Data W3C ” Data completa più ore, minuti, secondi e un frazione decimale di secondo AAAA-MM-GGThh: mm: ss.sTZD (ad es. 1997-07-16T19: 20: 30.45 + 01: 00) ” Formato data e ora W3C .

Risposta

Che ne dici del buon vecchio:

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

Commenti

  • Dove sono le informazioni sul fuso orario?
  • Funziona sia su Mac che su Linux ‘ date ‘
  • Che ne dici di millisecondi?
  • nota rapida qui, senza aprire la RFC, il segmento del fuso orario, 0200 manca dei due punti, il che potrebbe danneggiare alcuni sistemi che lo richiedono.
  • @MikeMackintosh ‘ La nota è pertinente; loutput mostrato qui non è una data RFC 3339 legale. I due punti nel segmento del fuso orario sono obbligatori per RFC 3339; consulta la definizione di time-numoffset su tools.ietf.org/html/rfc3339#section-5.6 .

Risposta

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" 

Questi comandi sono compatibili con POSIX, con leccezione della %z specifica di conversione. Tuttavia, %z è ampiamente supportato e funziona allo stesso modo in Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix e Haiku. Funziona anche con gli strumenti in Busybox, Toybox e sbase (le utilità di sistema di base di suckless.org). Poiché %z restituisce lo scostamento del fuso orario nel formato ±HHMM, abbiamo bisogno della barra sed da aggiungere due punti e cambiarlo in ±HH:MM.

NOTA: il comando date del progetto Heirloom ha %z output: non stampa un segno +.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *