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
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 sers/\(\....\).*\([+-]\)/\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 +
.
2013-09-05 14:58:33.102 -0800
excepto cuando s alguna razón por la que los espacios no deben usarse en absoluto.