¿Qué es un comando estándar para imprimir una fecha en formato RFC-3339?

El comando date no ofrece tal cosa, lo cual es un poco triste ya que RFC-3339 es el formato moderno, generalizado y sano que se utiliza en todas partes (excepto en el correo electrónico que no es ni moderno ni sano).

Mi desplazamiento de zona horaria es actualmente -08: 00, por lo que la forma más simple de este comando debería imprimir la hora actual como 2013-09-05T14:58:33.102-08:00.

Comentarios

  • ¿Qué estándar (s) está interesado? en?
  • Personalmente estoy bien con GNU pero en el gran esquema de cosas realmente debería ser más amplio que eso. También debería venir con un valor predeterminado razonable (opción corta, precisión de milisegundos) y tener una forma de especificar la precisión del subsegundo (número de dígitos distintos de 0 o 9).
  • Es ‘ s no un formato sensato: el total la ausencia de espacios en blanco hace que sea innecesariamente difícil de leer para los humanos. Debes usar la ligera variación 2013-09-05 14:58:33.102 -0800 excepto cuando s alguna razón por la que los espacios no deben usarse en absoluto.
  • Lo estaba comparando con el formato de fecha de correo (RFC 822, 2822) que es difícil de leer tanto para humanos como para máquinas.

Respuesta

Parece que puedes hacer varios formatos usando el cambio a la implementación GNU de date (versión 5.90 o superior), --rfc3339=.

Ejemplos

$ date --rfc-3339=date 2014-03-19 $ date --rfc-3339=seconds 2014-03-19 18:00:05-04:00 $ date --rfc-3339=ns 2014-03-19 18:00:08.179780629-04:00 

Si desea que se agregue T, como un truco:

$ date --rfc-3339=seconds | sed "s/ /T/" 2014-03-19T18:35:03-04:00 

Si lo desea en milisegundos :

$ date --rfc-3339=ns | sed "s/ /T/; s/\(\....\).*\([+-]\)/\1\2/g" 2014-03-19T18:42:52.362-04:00 

Referencias

Comentarios

  • En estos días, no se necesita ningún truco para obtener el ‘ T ‘. El --iso-8601' option accepts the same arguments as –rfc-3339` e incluye el ‘ T ‘ en su salida.
  • Sed part s/\(\....\).*-/\1-/g debe ser s/\(\....\).*\([+-]\)/\1\2/g para trabajar también al este del Atlántico.
  • @svante – gracias por el detalle, arreglado.
  • @Eonil que en realidad no es correcto, el RFC3339 dice: NOTE: ISO 8601 defines date and time separated by "T". Mientras que RFC3339 le permite usar un espacio en su lugar. Lea la ietf.org/rfc/rfc3339.txt Sección 5.6
  • @ rwenz3l Mi culpa. Acabo de leer solo la parte ABNF y me perdí las notas. ¡Gracias por señalarlo!

Responder

Con GNU date (5,90 o superior):

$ TZ=America/Anchorage date "+%FT%T.%N%:z" 2014-03-19T14:29:31.041119357-08:00 

Reemplaza %N por %3N para milisegundos, %6N para microsegundos …

AFAIK, ninguna de las especificaciones POSIX, Unix o LSB especifica ningún comando que pueda mostrar tiempos con granularidad inferior a un segundo, pero la parte fraccionaria es opcional en RFC 3339.

POSIX / Unix / LSB strftime admite %z para mostrar el desplazamiento TZ como -0800, así que lo más portátil que probablemente obtendrá es:

 $ TZ=America/Anchorage perl -MPOSIX -le "$t = strftime "%Y-%m-%dT%T%z", localtime; $t =~ s/..$/:$&/; print $t" 2014-03-19T14:30:23-08:00 

Respuesta

También puede formatear la hora de acuerdo con RFC3339 (ISO8601) más fácil:

 $ date -u +"%Y-%m-%dT%H:%M:%SZ" 2016-11-08T08:52:55Z  

NOTA: Este formulario at también se utiliza en la Label Schema Convention RC 1.0

Comentarios

  • Ese ‘ no es un RFC3339 válido. La respuesta de Eran ‘ de « `date +% Y-% m-% dT% T% z` « es correcta y tiene menos caracteres. Si quieres en UTC pass -u flag, que pondrá a cero el desplazamiento de la zona horaria.
  • Con la marca -u esta respuesta es correcta, ¿verdad?
  • @briceburg, ¿por qué este RFC3339 no es válido? Según tools.ietf.org/html/rfc3339#section-5.6 , parece ser correcto hasta donde yo sé.

Respuesta

GNU date tiene el formato ISO-8601 integrado, no es que ¿Muy cerca o incluso idéntico a RFC-3339?

1065 % date --iso-8601=seconds 2014-03-19T16:51:16-0600 

Comentarios

  • ISO-8601 permite diferentes formatos de fechas y horas, pero creo que el OP está pidiendo específicamente el formato Fecha W3C » Fecha completa más horas, minutos, segundos y un fracción decimal de un segundo AAAA-MM-DDThh: mm: ss.sTZD (p. ej. 1997-07-16T19: 20: 30.45 + 01: 00) » Formatos de fecha y hora del W3C .

Respuesta

¿Qué tal el buen viejo:

$ date +%Y-%m-%dT%T%z 2015-10-29T14:47:06+0200 

Comentarios

  • ¿Dónde está la información de la zona horaria?
  • Esto funciona tanto en mac como en linux ‘ date ‘
  • ¿Qué tal milisegundos?
  • nota rápida aquí, sin abrir el RFC, el segmento de zona horaria, 0200 falta dos puntos, lo que puede romper algunos sistemas que lo requieren.
  • La nota de @MikeMackintosh ‘ es pertinente; el resultado que se muestra aquí no es una fecha RFC 3339 legal. Los dos puntos en el segmento de zona horaria son necesarios para RFC 3339; consulte la definición de time-numoffset en tools.ietf.org/html/rfc3339#section-5.6 .

Responder

echo "Local date only:" date "+%Y-%m-%d" echo echo "Local date and time:" date "+%Y-%m-%dT%H:%M:%S%z" | sed "s@^.\{22\}@&:@" echo echo "UTC date and time:" date -u "+%Y-%m-%dT%H:%M:%SZ" 

Estos comandos son compatibles con POSIX, con la excepción de la %z especificación de conversión. Sin embargo, %z es ampliamente compatible y funciona de la misma manera en Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix y Haiku. También funciona con las herramientas de Busybox, Toybox y sbase (las utilidades del sistema base de suckless.org). Dado que %z genera el desplazamiento de zona horaria en formato ±HHMM, necesitamos la tubería sed para agregar dos puntos y cámbielo a ±HH:MM.

NOTA: El comando «s date del proyecto Heirloom tiene %z salida: no imprime un +.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *