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

205

Dans un script Bash, je veux imprimer la date / heure actuelle au format ISO 8601 (de préférence 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 datene répertorie pas cette option.

Quelqu'un sait pourquoi c'est, ou tout autre moyen (facile) pour moi d'imprimer la date au format ISO 8601? Merci!

Aseem Kishore
la source
2
Pour clarifier, je veux une date ISO 8601 complète, y compris l'heure, et de préférence dans le fuseau horaire UTC.
Aseem Kishore
Il vaut mieux simplement modifier la question. Dans quel format voulez-vous l'heure?
Tom Zych
@Tom: d'accord, édité. Par format, l'ISO 8601 n'est-elle pas assez spécifique?
Aseem Kishore
Non, ISO 8601 n'est pas assez spécifique. Cette norme spécifie un certain nombre de formats de diverses précisions. Les deux 2011-08-27et 2011-08-27T18:55:43Zsont au format ISO 8601. Et vraiment, modifier la question serait plus utile que de diffuser les mises à jour sur plusieurs commentaires. Un exemple de ce que vous essayez d'imprimer serait idéal.
Keith Thompson
8
Avoir installé GNU coreutils en utilisant brew(qui utilise le préfixe «g») gdate -Ia fonctionné, avec d'autres indicateurs GNU.
Joel Purra

Réponses:

361

Vous pourriez utiliser

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

Ou pour une date entièrement conforme ISO-8601 , utilisez l'un des formats suivants:

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

Production:

2011-08-27T23:22:37Z

ou

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

Production:

2011-08-27T15:22:37-0800
amit_g
la source
7
Techniquement, le "T" est recommandé mais facultatif dans ISO 8601. Utiliser un espace au lieu de "T" serait: date -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque
Finalement! J'ai ajouté ceci à mon bash_alias
Christian Bongiorno
Oui, réponse géniale Merci !, mais c'est date -u +"%Y-%m-%dT%H:%MZ"exactement ce que je cherchais.
ChikuMiku
3
@mbigras: Zet +00:00sont les mêmes (pour la plupart). Aux fins de la traduction de l'heure, ils signifient tous deux UTC. Cependant l'Angleterre est +00:00en hiver et +01:00en été (BST).
Jeffrey Hulten
5
@JeffreyHulten: "ils signifient tous les deux UTC" - Nitpick, mais Zc'est UTC, alors que +00:00c'est GMT. UTC n'est pas un fuseau horaire et n'a pas de décalage; Le décalage est défini comme le décalage horaire entre un fuseau horaire et UTC, la norme de mesure du temps. GMT est +00: 00 supprimé de UTC (et BST est, comme vous le dites, +01: 00 supprimé de UTC).
Amadan le
59

Date GNU date -Iest le même que date +%F, et -Isecondset -Iminutescomprennent également le temps avec décalage TUC.

$ 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

-uest comme TZ=UTC. +00:00peut ê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 valides:

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)
Lri
la source
4
Hourra pour + "% FT% T% z" c'est exactement ce dont j'avais besoin
Noah Yetter
25

Une alternative courte qui fonctionne à la fois sur les dates GNU et BSD est:

date -u +%FT%T%z
Un gars
la source
8
ou date -u +%FT%TZparce qu'en UTC, le décalage serait de toute façon nul
akostadinov
17

Le paquet coreutils fournit des versions GNU des outils. À installer:

$ brew install coreutils

Vous pouvez voir ce qui est fourni:

$ brew list coreutils

Notez qu'il est livré avec la date:

$ brew list coreutils | grep date

Ceci est la commande de date GNU standard donc elle prendra le commutateur -I:

$ gdate -I
2016-08-09
slm
la source
1
Ou: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
OlivierLarue
5

Utilisez simplement les dateoptions de formatage normales :

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

Edit: pour inclure l'heure et UTC, ceux-ci sont équivalents:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
Tom Zych
la source
Ajout d'un commentaire à mon OP précisant que je veux la date complète, y compris l'heure, et de préférence dans le fuseau horaire UTC. Merci pour le conseil!
Aseem Kishore
3

Ce n'est pas une fonctionnalité de Bash, c'est une fonctionnalité du datebinaire. Sur Linux, vous auriez généralement la version GNU coreutils de date, tandis que sur OSX, vous auriez les utilitaires hérités BSD. La version GNU peut certainement être installée en tant que package optionnel, ou vous pouvez utiliser votre propre remplacement - je pense que cela devrait être un simple one-liner, par exemple en Perl.

tripleee
la source
Intéressant, merci. Je suis une sorte de noob Mac / Linux / Unix / Bash; cela vous dérangerait-il d'élaborer sur coreutils et comment l'installer sur Mac? Merci!
Aseem Kishore
2

En prenant les autres réponses un peu plus loin, vous pouvez ajouter une fonction à votre ~ / .bashrc ou ~ / .zshrc pour ajouter l' -Iindicateur de date :

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

J'utilise régulièrement 'date -I' sous Linux lors de l'enregistrement de fichiers. ex: touchez x. date -I. Alors que l'équivalent sous MacOS est 'date +% F', il est un peu difficile de taper à chaque fois que j'enregistre un fichier. Donc, j'ai défini un alias "alias dt = 'date +% F'" puis touchez x. dtme donne la date.

Brian Ampolsk
la source