Il comando `date` su OS X non ha l'opzione ISO 8601` -I`?


194

In uno script Bash, voglio stampare il datetime corrente in formato ISO 8601 (preferibilmente UTC), e sembra che questo dovrebbe essere semplice come date -I:

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

Ma questo non sembra funzionare sul mio Mac:

$ 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]

E infatti, man datenon elenca questa opzione.

Qualcuno sa perché questo è, o qualsiasi altro modo (semplice) per me stampare la data in formato ISO 8601? Grazie!


2
Per chiarire, desidero una data ISO 8601 completa, compreso l'orario, e preferibilmente nel fuso orario UTC.
Aseem Kishore,

È meglio solo modificare la domanda. In quale formato vuoi il tempo?
Tom Zych,

@ Tom: va bene, modificato. Per formato, ISO 8601 non è abbastanza specifico?
Aseem Kishore,

No, ISO 8601 non è abbastanza specifico. Tale standard specifica una serie di formati di varie precisioni. Entrambi 2011-08-27e 2011-08-27T18:55:43Zsono formati ISO 8601. E davvero, la modifica della domanda sarebbe più utile che scattare aggiornamenti attraverso diversi commenti. Un esempio di ciò che stai cercando di stampare sarebbe l'ideale.
Keith Thompson,

6
Dopo aver installato i coreutils GNU usando brew(che usa il prefisso 'g') gdate -Iha funzionato, insieme ad altri flag GNU.
Joel Purra,

Risposte:


348

Puoi usare

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

O per una data pienamente conforme a ISO-8601 , utilizzare uno dei seguenti formati:

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

Produzione:

2011-08-27T23:22:37Z

o

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

Produzione:

2011-08-27T15:22:37-0800

7
Tecnicamente, la "T" è raccomandata ma facoltativa in ISO 8601. L'uso di uno spazio anziché "T" sarebbe: data -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque

Finalmente! Ho aggiunto questo al mio bash_alias
Christian Bongiorno,

Sì, risposta eccezionale Grazie !, ma date -u +"%Y-%m-%dT%H:%MZ"esattamente quello che stavo cercando.
ChikuMiku,

3
@mbigras: Ze +00:00sono gli stessi (principalmente). Ai fini della traduzione del tempo, entrambi significano UTC. Tuttavia, l'Inghilterra è +00:00in inverno e +01:00in estate (BST).
Jeffrey Hulten,

5
@JeffreyHulten: "entrambi significano UTC" - Nitpick, ma Zè UTC, mentre +00:00è GMT. UTC non è un fuso orario e non ha un offset; offset è definito come la differenza di tempo tra un fuso orario e UTC, lo standard di misurazione del tempo. GMT è +00: 00 rimosso da UTC (e BST è, come dici tu, +01: 00 rimosso da UTC).
Amadan,

57

In data GNU date -Iè lo stesso date +%F, ed -Isecondse -Iminutesincludere anche il tempo con Offset UTC.

$ 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

-uè come TZ=UTC. +00:00può essere sostituito con Z.

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

Questi sono anche formati di data o ora ISO 8601 validi:

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)

Questi non sono:

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)

3
evviva per + "% FT% T% z" è esattamente quello di cui avevo bisogno
Noah Yetter,

22

Una breve alternativa che funziona sia su GNU che su BSD è:

date -u +%FT%T%z

7
o date -u +%FT%TZperché in offset UTC sarebbe comunque zero
akostadinov il

15

Il pacchetto coreutils fornisce versioni GNU di strumenti. Installare:

$ brew install coreutils

Puoi vedere cosa viene fornito:

$ brew list coreutils

Si noti che arriva con la data:

$ brew list coreutils | grep date

Questo è il comando di data GNU standard, quindi prenderà l'opzione -I:

$ gdate -I
2016-08-09

1
Oppure:: gdate --iso-8601=ns2016-09-29T16: 54: 23.485230000 + 02: 00
Olivier

5

Usa le normali dateopzioni di formattazione:

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

Modifica: per includere ora e UTC, questi sono equivalenti:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

Ho aggiunto un commento al mio PO chiarendo che desidero la data completa, compreso l'orario, e preferibilmente nel fuso orario UTC. Grazie per la punta, però!
Aseem Kishore,

3

Non è una caratteristica di Bash, è una caratteristica del datebinario. Su Linux normalmente avresti la versione GNU coreutils di date, mentre su OSX avresti le utility legacy di BSD. La versione GNU può certamente essere installata come pacchetto opzionale, oppure puoi creare il tuo sostituto - credo che dovrebbe essere un semplice one-liner, ad esempio in Perl.


Interessante, grazie. Sono una specie di noob Mac / Linux / Unix / Bash; ti dispiacerebbe elaborare su coreutils e come installarlo su Mac? Grazie!
Aseem Kishore,

2

Portando le altre risposte un passo avanti, potresti aggiungere una funzione al tuo ~ / .bashrc o ~ / .zshrc per aggiungere il -Iflag della data :

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

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.