¿El comando `date` en OS X no tiene la opción ISO 8601` -I`?

En un script de Bash, quiero imprimir la fecha y hora actual en ISO 8601 formato (preferiblemente UTC), y parece que esto debería ser tan simple como date -I:

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

Pero esto no parece funcionar en mi 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]

Y de hecho, man date no incluye esta opción.

¿Alguien sabe por qué es esto, o cualquier otra forma (fácil) de imprimir la fecha en formato ISO 8601? ¡Gracias!

preguntado el 27 de agosto de 11 a las 18:08

Para aclarar, quiero una fecha ISO 8601 completa, incluida la hora, y preferiblemente en la zona horaria UTC. -

Es mejor simplemente editar la pregunta. ¿En qué formato quieres la hora? -

@Tom: está bien, editado. Por formato, ¿ISO 8601 no es lo suficientemente específico? -

No, ISO 8601 no es lo suficientemente específico. Ese estándar especifica varios formatos de varias precisiones. Ambos 2011-08-27 y 2011-08-27T18:55:43Z son formatos ISO 8601. Y realmente, editar la pregunta sería más útil que distribuir actualizaciones en varios comentarios. Un ejemplo de lo que está intentando imprimir sería ideal. -

Habiendo instalado Coreutils de GNU usar brew (que usa el prefijo 'g') gdate -I funcionó, junto con otras banderas GNU. -

9 Respuestas

Podrías usar

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

O para un Fecha de conformidad con ISO-8601, utilice uno de los siguientes formatos:

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

Salida:

2011-08-27T23:22:37Z

or

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

Salida:

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

Respondido el 09 de diciembre de 15 a las 02:12

Técnicamente, se recomienda la "T", pero es opcional en ISO 8601. Usar un espacio en lugar de "T" sería: fecha -u + "% Y-% m-% d% H-% M-% SZ" - Albahaca bourque

¡Finalmente! Agregué esto a mi bash_alias - Christian Bongiorno

Sí, increíble respuesta ¡Gracias !, pero esto date -u +"%Y-%m-%dT%H:%MZ" exactamente lo que estaba buscando. - ChikuMiku

@mbigras: Z y +00:00 son los mismos (en su mayoría). A los efectos de traducir la hora, ambos se refieren a UTC. Sin embargo, Inglaterra es +00:00 en invierno y +01:00 en verano (BST). - Jeffrey Hulten

@JeffreyHulten: "ambos se refieren a UTC" - Nitpick, pero Z es UTC, mientras que +00:00 es GMT. UTC no es una zona horaria y no tiene un desplazamiento; El desplazamiento se define como la diferencia horaria entre una zona horaria y UTC, el estándar de medición de la hora. GMT es +00: 00 eliminado de UTC (y BST es, como usted dice, +01: 00 eliminado de UTC). - Amadan

En fecha GNU date -I es el mismo que date +%Fy -Iseconds y -Iminutes también incluye la hora con compensación 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 es como TZ=UTC. +00:00 puede ser reemplazado con Z.

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

Estos también son formatos válidos de fecha u hora ISO 8601:

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)

Estos no son:

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)

contestado el 03 de mayo de 13 a las 18:05

hurra por + "% FT% T% z" eso es exactamente lo que necesitaba - Noah Yetter

Una pequeña alternativa que funciona tanto en GNU como en BSD es:

date -u +%FT%T%z

Respondido el 07 de diciembre de 15 a las 19:12

or date -u +%FT%TZ porque en UTC el desplazamiento sería cero de todos modos - Akostadinov

El paquete coreutils proporciona versiones GNU de herramientas. Instalar:

$ brew install coreutils

Puede ver lo que se proporciona:

$ brew list coreutils

Tenga en cuenta que viene con fecha:

$ brew list coreutils | grep date

Este es el comando de fecha estándar de GNU, por lo que tomará el interruptor -I:

$ gdate -I
2016-08-09

Respondido el 02 de enero de 17 a las 23:01

O bien: gdate --iso-8601=ns : 2016-09-29T16:54:23,485230000+02:00 - OlivierLarue

Solo usa normal date opciones de formato:

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

Editar: para incluir la hora y UTC, estos son equivalentes:

date -u -Iseconds

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

Respondido 27 ago 11, 22:08

Agregué un comentario a mi OP aclarando que quiero la fecha completa, incluida la hora, y preferiblemente en la zona horaria UTC. ¡Gracias por el consejo! - Aseem Kishore

No es una característica de Bash, es una característica del date binario. En Linux, normalmente tendría la versión GNU coreutils de date, mientras que en OSX tendrías las utilidades heredadas de BSD. La versión GNU ciertamente se puede instalar como un paquete opcional, o puede lanzar su propio reemplazo; creo que debería ser una simple línea, por ejemplo, en Perl.

Respondido 27 ago 11, 22:08

Interesante, gracias. Soy una especie de novato en Mac / Linux / Unix / Bash; ¿Le importaría profundizar en coreutils y cómo instalarlo en Mac? ¡Gracias! - Aseem Kishore

Hay un precompilado coreutils paquete para Mac OS X disponible en:

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

Respondido 28 ago 11, 14:08

Tomando las otras respuestas un paso más allá, puede agregar una función a su ~ / .bashrc o ~ / .zshrc para agregar la fecha -I bandera:

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

Respondido 11 Oct 18, 15:10

Utilizo regularmente 'date -I' en Linux al guardar archivos. ej: toque x.date -I. Si bien el equivalente en MacOS es 'fecha +% F', es un poco incómodo escribir cada vez que guardo un archivo. Entonces, establezco un alias "alias dt = 'fecha +% F'" y luego toco x.dt me da la fecha.

Respondido 16 ago 20, 14:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.