web-dev-qa-db-fra.com

La commande `date` sur OS X n'a ​​pas ISO 8601 L'option -I`?

Dans un script Bash, je souhaite imprimer la date/heure actuelle au format ISO 8601 (de préférence, au format UTC), et il semble que cela devrait être aussi simple que date -I:

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

Mais cela ne semble pas fonctionner sur mon 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]

Et en effet, man date ne répertorie pas cette option.

Quelqu'un sait-il pourquoi c'est une autre manière (facile) d'imprimer la date au format ISO 8601? Merci!

170
Aseem Kishore

Vous pourriez utiliser

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

Ou pour une date complète date conforme à la norme ISO-8601 , utilisez l'un des formats suivants:

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

Sortie:

2011-08-27T23:22:37Z

ou

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

Sortie:

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

Dans GNU date date -I est le même que date +%F, et -Iseconds et -Iminutes comprennent également le temps avec décalage 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 est comme TZ=UTC. +00:00 peut être remplacé par Z.

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

Ce sont également des formats de date ou d’heure ISO 8601 en vigueur:

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)

Ce ne sont pas:

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)
55
Lri

Une alternative courte qui fonctionne à la fois GNU et la date BSD est:

date -u +%FT%T%z
20
SomeGuy

Le paquet coreutils fournit les versions GNU des outils. Pour installer:

$ brew install coreutils

Vous pouvez voir ce qui est fourni:

$ brew list coreutils

Remarquez qu'il vient avec la date:

$ brew list coreutils | grep date

Ceci est la commande standard GNU date afin de prendre le commutateur -I:

$ gdate -I
2016-08-09
15
slm

Utilisez simplement les options de formatage normales date:

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

Edit: pour inclure le temps et UTC, ce sont équivalents:

date -u -Iseconds

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

Ce n'est pas une fonctionnalité de Bash, c'est une fonctionnalité du binaire date. Sous Linux, vous avez généralement GNU la version coreutils de date, tandis que sous OSX, vous disposiez des utilitaires hérités BSD. GNU version peut certainement être installé en option, ou vous pouvez choisir votre propre remplaçant - je pense que cela devrait être une simple doublure, par exemple en Perl.

2
tripleee

En poussant les autres réponses un peu plus loin, vous pourriez ajouter une fonction à votre ~/.bashrc ou ~/.zshrc pour ajouter la date -I drapeau:

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

Un paquetage précompilé coreutils pour Mac OS X est disponible à l'adresse suivante:

http://rudix.org/packages-abc.html#coreutils .

1
tonyk