Che cos'è un comando standard per stampare una data nel formato RFC-3339?


19

Il datecomando non offre una cosa del genere, il che è un po 'triste poiché RFC-3339 è il formato moderno, diffuso e sano usato ovunque (tranne che nell'e-mail che non è né moderna né sana).

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


A quali standard sei interessato?
Stéphane Chazelas,

Personalmente sto bene con GNU, ma nel grande schema delle cose dovrebbe davvero essere più ampio di così. Dovrebbe anche venire con un valore predefinito ragionevole (opzione breve, precisione in millisecondi) e avere un modo per specificare la precisione del secondo (numero di cifre diverso da 0 o 9).
Martin Jambon,

1
E ' non è un formato sano di mente: la totale assenza di spazi rende inutilmente difficile lettura per gli umani. Dovresti usare la leggera variazione 2013-09-05 14:58:33.102 -0800tranne quando c'è qualche motivo per cui gli spazi non devono essere usati affatto.
zwol,

1
Lo stavo confrontando con il formato della data di posta (RFC 822, 2822) che è difficile da leggere sia per l'uomo che per la macchina.
Martin Jambon,

Risposte:


30

Sembra che si può fare diversi formati utilizzando l'interruttore per l'implementazione GNU di date(versione 5.90 o superiore), --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 vuoi Tche venga aggiunto, come hack:

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

Se lo vuoi in millisecondi:

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

Riferimenti


7
In questi giorni, non è necessario alcun hack per ottenere la "T". Il --iso-8601' option accepts the same arguments as --RFC-3339`, e comprende la 'T' nella sua produzione.
Ti Strga,

1
La parte di Sed s/\(\....\).*-/\1-/gdovrebbe s/\(\....\).*\([+-]\)/\1\2/gfunzionare anche a est dell'Atlantico.
svante

1
@svante - grazie per il dettaglio, risolto.
slm

2
@Eonil che in realtà non è corretto, RFC3339 afferma: NOTE: ISO 8601 defines date and time separated by "T".Mentre RFC3339 consente invece di utilizzare uno spazio. Leggi ietf.org/rfc/rfc3339.txt Sezione 5.6
rwenz3l

1
@ rwenz3l Colpa mia. Ho appena letto solo la parte ABNF e ho perso le note. Grazie per segnalarlo!
Eonil

18

Con GNU date(5.90 o successivo):

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

Sostituisci %Ncon %3Nper millisecondi, %6Nper micro-secondi ...

AFAIK, nessuna delle specifiche POSIX, Unix o LSB specifica alcun comando in grado di visualizzare i tempi con granularità al secondo, ma la parte frazionaria è opzionale in RFC 3339.

POSIX / Unix / LSB strftime supporta la %zvisualizzazione dell'offset 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

8

GNU dateha il formato ISO-8601 integrato - non è abbastanza vicino o addirittura identico a RFC-3339?

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

ISO-8601 consente diverse formattazioni di date e orari, ma penso che l'OP chieda specificamente il formato data W3C "Data completa più ore, minuti, secondi e una frazione decimale di un secondo AAAA-MM-GGThh: mm: ss.sTZD (es. 1997-07-16T19: 20: 30.45 + 01: 00) " - Formati di data e ora del W3C .
Hakre,

8

Che ne dici di bravo vecchio:

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

Dove sono le informazioni sul fuso orario?
Raphael Ahrens,

Funziona sia su Mac che su Linux 'date'
Eran Chetzroni,

1
Che ne dici di millisecondi?
Martin Jambon,

6
una breve nota qui, senza aprire RFC, il segmento del fuso orario, 0200manca di due punti, che potrebbero rompere alcuni sistemi che lo richiedono.
Mike Mackintosh,

2
La nota di @ MikeMackintosh è pertinente; l'output mostrato qui non è una data RFC 3339 legale. I due punti nel segmento del fuso orario sono richiesti per RFC 3339; vedere la definizione di time-numoffsetat tools.ietf.org/html/rfc3339#section-5.6 .
Mark Amery,

7

È inoltre possibile formattare il tempo in base a RFC3339 (ISO8601) più facilmente:

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

NOTA: questo formato è utilizzato anche nella Label Schema Convention RC 1.0


Non è un RFC3339 valido. La risposta di Eran di `` `data +% Y-% m-% dT% T% z` `` è corretta e meno caratteri. Se si desidera in UTC passare -u flag, che azzera l'offset del fuso orario.
briceburg

Con la -ubandiera questa risposta è corretta, giusto?
Lassi,

0
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, ad eccezione della %zspecifica 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 di Busybox, Toybox e sbase (le utility del sistema di base suckless.org). Poiché %zgenera l'offset del fuso orario nel ±HHMMformato, abbiamo bisogno della sedpipe per aggiungere due punti e cambiarlo in ±HH:MM.

NOTA: il datecomando del progetto Heirloom ha un %zoutput incompatibile : non stampa un +segno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.