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


194

En un script Bash, quiero imprimir la fecha y hora actual en formato ISO 8601 (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 dateno enumera esta opción.

¿Alguien sabe por qué es esto, o alguna otra forma (fácil) para que imprima la fecha en formato ISO 8601? ¡Gracias!


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

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

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

No, ISO 8601 no es lo suficientemente específico. Ese estándar especifica una serie de formatos de varias precisiones. Ambos 2011-08-27y 2011-08-27T18:55:43Zson 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.
Keith Thompson

66
Habiendo instalado GNU coreutils usando brew(que usa el prefijo 'g') gdate -Ifuncionó, junto con otros indicadores de GNU.
Joel Purra

Respuestas:


348

Podrías usar

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

O para una fecha totalmente compatible con ISO-8601 , use uno de los siguientes formatos:

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

Salida:

2011-08-27T23:22:37Z

o

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

Salida:

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

77
Técnicamente, la "T" se recomienda pero es opcional en ISO 8601. El uso de un espacio en lugar de 'T' sería: fecha -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque

¡Finalmente! Agregué esto a mis bash_alias
Christian Bongiorno

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

3
@mbigras: Zy +00:00son iguales (en su mayoría). A los fines de traducir el tiempo, ambos significan UTC. Sin embargo, Inglaterra es +00:00en invierno y +01:00en verano (BST).
Jeffrey Hulten

55
@JeffreyHulten: "ambos significan UTC" - Nitpick, pero Zes UTC, mientras que +00:00es 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 tiempo. GMT es +00: 00 eliminado de UTC (y BST es, como usted dice, +01: 00 eliminado de UTC).
Amadan el

57

En GNU, la fecha date -Ies la misma que date +%F, -Isecondsy -Iminutestambién incluye la hora con desplazamiento 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

-ues como TZ=UTC. +00:00puede ser reemplazado con Z.

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

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

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)

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

22

Una alternativa corta que funciona tanto en la fecha GNU como en la BSD es:

date -u +%FT%T%z

77
o date -u +%FT%TZporque en UTC el desplazamiento sería cero de todos modos
akostadinov

15

El paquete coreutils proporciona versiones GNU de herramientas. Instalar:

$ brew install coreutils

Puedes ver lo que se proporciona:

$ brew list coreutils

Tenga en cuenta que viene con la fecha:

$ brew list coreutils | grep date

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

$ gdate -I
2016-08-09

1
O: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
Olivier

5

Simplemente use las dateopciones de formato normales :

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

Editar: para incluir el tiempo y UTC, estos son equivalentes:

date -u -Iseconds

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

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

3

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


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

2

Si lleva las otras respuestas un paso más allá, puede agregar una función a su ~ / .bashrc o ~ / .zshrc para agregar el -Iindicador de fecha :

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.