Quest-ce quune commande standard pour imprimer une date au format RFC-3339?

La commande date noffre pas une telle chose, ce qui est assez triste puisque la RFC-3339 est la format moderne, répandu et sensé utilisé partout (sauf dans les e-mails qui ne sont ni modernes ni sensés).

Mon décalage de fuseau horaire est actuellement de -08: 00, donc la forme la plus simple de cette commande devrait afficher lheure actuelle sous la forme 2013-09-05T14:58:33.102-08:00.

Commentaires

  • Quelle (s) norme (s) vous intéresse dans?
  • Personnellement, je suis daccord avec GNU, mais dans le grand schéma des choses, il devrait vraiment être plus large que cela. Il devrait également être livré avec une valeur par défaut raisonnable (option courte, précision à la milliseconde) et avoir un moyen de spécifiez la précision de la sous-seconde (nombre de chiffres autre que 0 ou 9).
  • Il ‘ nest pas un format sain: le total labsence despace blanc rend la lecture inutilement difficile pour les humains. Vous devriez utiliser la légère variation 2013-09-05 14:58:33.102 -0800 sauf quand il Cest une raison pour laquelle les espaces ne doivent pas du tout être utilisés.
  • Je le comparais au format de date du courrier (RFC 822, 2822) qui est difficile à lire pour les humains et les machines.

Réponse

Il semble que vous puissiez faire plusieurs formats en utilisant le passage à limplémentation GNU de date (version 5.90 ou supérieure), --rfc3339=.

Exemples

$ 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 vous voulez que le T soit ajouté, en tant que hack:

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

Si vous le souhaitez en millisecondes :

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

Références

Commentaires

  • De nos jours, aucun piratage nest nécessaire pour obtenir le ‘ T ‘. --iso-8601' option accepts the same arguments as –rfc-3339`, et inclut le ‘ T ‘ dans son
  • Sed part s/\(\....\).*-/\1-/g doit être s/\(\....\).*\([+-]\)/\1\2/g pour fonctionner également à lest de lAtlantique.
  • @svante – merci pour le détail, corrigé.
  • @Eonil qui nest en fait pas correct, le RFC3339 déclare: NOTE: ISO 8601 defines date and time separated by "T". Alors que RFC3339 vous permet dutiliser un espace à la place. Lisez ietf.org/rfc/rfc3339.txt Section 5.6
  • @ rwenz3l Ma faute. Je viens de lire uniquement la partie ABNF et jai raté les notes. Merci de lavoir signalé!

Réponse

Avec GNU date (5,90 ou plus):

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

Remplacez %N par %3N pour les millisecondes, %6N pour les micro-secondes …

AFAIK, aucune des spécifications POSIX, Unix ou LSB ne spécifie de commande pouvant afficher les heures avec granularité inférieure à la seconde, mais la partie fractionnaire est facultative dans la RFC 3339.

POSIX / Unix / LSB strftime prend en charge %z pour afficher le décalage TZ comme -0800, donc le plus portable que vous « allez probablement obtenir est:

 $ 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 

Réponse

Vous pouvez également formater lheure selon RFC3339 (ISO8601) plus facilement:

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

REMARQUE: Ce formulaire at est également utilisé dans la Label Schema Convention RC 1.0

Commentaires

  • Ce ‘ nest pas une RFC3339 valide. La réponse dEran ‘ à «  «  date +% Y-% m-% dT% T% z «  est correcte et comporte moins de caractères. Si vous voulez en UTC passer lindicateur -u, qui mettra à zéro le décalage du fuseau horaire.
  • Avec lindicateur -u, cette réponse est correcte, non?
  • @briceburg pourquoi ce RFC3339 nest-il pas valide? Daprès tools.ietf.org/html/rfc3339#section-5.6 , cela semble correct pour autant que je sache.

Réponse

GNU date a le format ISO-8601 intégré – nest pas que assez proche voire identique à la RFC-3339?

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

Commentaires

  • ISO-8601 permet différentes formatage des dates et des heures, mais je pense que lOP demande spécifiquement le format Date W3C  » Date complète plus heures, minutes, secondes et un fraction décimale dune seconde AAAA-MM-JJThh: mm: ss.sTZD (par exemple 1997-07-16T19: 20: 30.45 + 01: 00)  » Formats de date et dheure W3C .

Réponse

Que diriez-vous du bon vieux temps:

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

Commentaires

  • Où sont les informations de fuseau horaire?
  • Cela fonctionne à la fois sur Mac et Linux ‘ date ‘
  • Et les millisecondes?
  • note rapide ici, sans ouvrir la RFC, le segment de fuseau horaire, 0200 manque un deux-points, ce qui peut casser certains systèmes qui en ont besoin.
  • La note de

  • @MikeMackintosh ‘ est pertinente; la sortie montrée ici nest pas une date RFC 3339 légale. Les deux points dans le segment de fuseau horaire sont requis pour la RFC 3339; voir la définition de time-numoffset à tools.ietf.org/html/rfc3339#section-5.6 .

Réponse

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" 

Ces commandes sont compatibles POSIX, à lexception de la spécification de conversion %z. Cependant, %z est largement pris en charge et fonctionne de la même manière sous Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix et Haiku. Il fonctionne également avec les outils de Busybox, Toybox et sbase (les utilitaires système de base suckless.org). Puisque %z affiche le décalage du fuseau horaire au format ±HHMM, nous avons besoin du tube sed à ajouter un deux-points et remplacez-le par ±HH:MM.

REMARQUE: La commande date du projet Heirloom est incompatible %z sortie: il nimprime pas de signe +.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *