Ce este o comandă standard pentru imprimarea unei date în format RFC-3339?

Comanda date nu oferă așa ceva, ceea ce este un pic trist, deoarece RFC-3339 este format modern, răspândit, sănătos, folosit peste tot (cu excepția e-mailurilor care nu sunt nici moderne, nici sănătos).

Decalajul fusului meu orar este în prezent -08: 00, deci cea mai simplă formă a acestei comenzi ar trebui să tipărească ora curentă ca 2013-09-05T14:58:33.102-08:00.

Comentarii

  • Care standard vă interesează în?
  • Personal, sunt bine cu GNU, dar în marea schemă de lucruri ar trebui să fie într-adevăr mai largă decât atât. Ar trebui să vină și cu o valoare implicită rezonabilă (opțiune scurtă, precizie milisecundă) și să aibă o modalitate de a specificați precizia subsecundă (numărul de cifre, altele decât 0 sau 9).
  • ‘ s nu un format sănătos: totalul absența spațiului alb face dificilă citirea oamenilor. Ar trebui să utilizați o ușoară variație 2013-09-05 14:58:33.102 -0800, cu excepția cazului în care Este un motiv pentru care spațiile nu trebuie folosite deloc.
  • L-am comparat cu formatul de dată prin poștă (RFC 822, 2822), care este greu de citit atât pentru oameni, cât și pentru mașini.

Răspuns

Se pare că puteți face mai multe formate folosind trecerea la implementarea GNU a date (versiunea 5.90 sau mai mare), --rfc3339=.

Exemple

$ 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 

Dacă doriți ca T să fie adăugat, ca hack:

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

Dacă îl doriți în milisecunde :

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

Referințe

Comentarii

  • În aceste zile, nu este nevoie de niciun hack pentru a obține ‘ T ‘. --iso-8601' option accepts the same arguments as –rfc-3339` și include ‘ T ‘ ieșire.
  • Partea s/\(\....\).*-/\1-/g Sed ar trebui să fie s/\(\....\).*\([+-]\)/\1\2/g pentru a funcționa și la est de Atlantic.
  • @svante – Vă mulțumim pentru detalii, remediate.
  • @Eonil care de fapt nu este corect, RFC3339 afirmă: NOTE: ISO 8601 defines date and time separated by "T". În timp ce RFC3339 vă permite să utilizați un spațiu în schimb. Citiți ietf.org/rfc/rfc3339.txt Secțiunea 5.6
  • @ rwenz3l Vina mea. Tocmai am citit doar partea ABNF și am ratat notele. Vă mulțumim că l-ați subliniat!

Răspundeți

Cu GNU date (5,90 sau mai mare):

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

Înlocuiți %N cu %3N pentru milisecunde, %6N pentru micro-secunde …

AFAIK, niciuna dintre specificațiile POSIX, Unix sau LSB nu specifică nicio comandă care poate afișa orele cu sub-secundă granularitate, dar partea fracționată este opțională în RFC 3339.

POSIX / Unix / LSB strftime acceptă %z pentru a afișa decalajul TZ ca -0800, deci cel mai portabil pe care probabil îl veți obține este:

 $ 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ăspuns

De asemenea, puteți formata ora în funcție de RFC3339 (ISO8601) mai ușor:

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

NOTĂ: Acest formular at este, de asemenea, utilizat în Label Schema Convention RC 1.0

Comentarii

  • ‘ nu este un RFC3339 valid. Răspunsul lui Eran ‘ din „„ data +% Y-% m-% dT% T% z “„ este corect și mai puține caractere. Dacă doriți în semnul UTC pass -u, care va elimina compensarea fusului orar.
  • Cu semnalizatorul -u acest răspuns este corect, nu?
  • @briceburg de ce nu este valabil RFC3339? Conform tools.ietf.org/html/rfc3339#section-5.6 pare a fi corect din câte îmi dau seama.

Răspuns

GNU date are formatul ISO-8601 încorporat – nu este destul de apropiat sau chiar identic cu RFC-3339?

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

Comentarii

  • ISO-8601 permite diferite formatări de date și ore, dar cred că OP solicită în mod specific formatul Data W3C ” Data completă plus ore, minute, secunde și o fracție zecimală de secundă YYYY-MM-DDThh: mm: ss.sTZD (ex. 1997-07-16T19: 20: 30.45 + 01: 00) ” Format date și oră W3C .

Răspuns

Ce zici de bun vechi:

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

Comentarii

  • Unde sunt informațiile privind fusul orar?
  • Acest lucru funcționează atât pe Mac, cât și pe Linux ‘ data ‘
  • Ce zici de milisecunde?
  • notă rapidă aici, fără a deschide RFC, segmentul fusului orar, 0200 lipsește un punct, care poate rupe unele sisteme care o necesită.
  • Nota @MikeMackintosh ‘ este pertinentă; rezultatul prezentat aici nu este o o dată legală RFC 3339. Coloanele din segmentul fusului orar sunt necesare pentru RFC 3339; consultați definiția time-numoffset la tools.ietf.org/html/rfc3339#section-5.6 .

Răspuns

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" 

Aceste comenzi sunt compatibile cu POSIX, cu excepția din specificația de conversie %z. Cu toate acestea, %z este acceptat pe scară largă și funcționează în același mod în Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix și Haiku. De asemenea, funcționează cu instrumentele din Busybox, Toybox și sbase (utilitarele sistemului de bază suckless.org). Deoarece %z generează compensarea fusului orar în format ±HHMM, avem nevoie de conducta sed pentru a adăuga două puncte și schimbați-l în ±HH:MM.

NOTĂ: Comanda Heirloom „s date are incompatibil %z ieșire: nu imprimă un semn +.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *