Hvad er en standardkommando til udskrivning af en dato i RFC-3339-format?

date -kommandoen tilbyder ikke sådan noget, hvilket er lidt trist, da RFC-3339 er moderne, udbredt, fornuftigt format, der bruges overalt (undtagen i e-mail, som hverken er moderne eller sund).

Min tidszone-forskydning er i øjeblikket -08: 00, så den enkleste form for denne kommando skal udskrive det aktuelle tidspunkt som div id = “be714d4c7f”>

.

Kommentarer

  • Hvilken standard (s) er du interesseret i?
  • Jeg personligt har det godt med GNU, men i den store ordning bør det virkelig være bredere end det. Det skal også komme med en rimelig standard (kort mulighed, millisekundpræcision) og have en måde at specificer sekunders præcision (antal andre cifre end 0 eller 9).
  • Det ' s ikke et sundt format: det samlede fravær af mellemrum gør det unødvendigt svært for mennesker at læse. Du skal bruge den lille variation 2013-09-05 14:58:33.102 -0800 undtagen når der er s en eller anden grund til, at mellemrum slet ikke må bruges.
  • Jeg sammenlignede det med maildatoformatet (RFC 822, 2822), som er svært at læse for både mennesker og maskiner.

Svar

Det ser ud til, at du kan gøre flere formater ved hjælp af omskifteren til GNU-implementering af date (version 5.90 eller derover), --rfc3339=.

Eksempler

$ 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 

Hvis du ønsker, at T skal tilføjes, som et hack:

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

Hvis du vil have det i millisekunder :

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

Referencer

Kommentarer

  • I disse dage er der ikke behov for hack for at få ' T '. --iso-8601' option accepts the same arguments as –rfc-3339` og inkluderer ' T ' output.
  • Sed del s/\(\....\).*-/\1-/g skal være s/\(\....\).*\([+-]\)/\1\2/g for også at arbejde øst for Atlanterhavet.
  • @svante – tak for detaljerne, rettet.
  • @Eonil der faktisk ikke er korrekt, siger RFC3339: NOTE: ISO 8601 defines date and time separated by "T". Mens RFC3339 giver dig mulighed for at bruge en plads i stedet. Læs ietf.org/rfc/rfc3339.txt Afsnit 5.6
  • @ rwenz3l Min fejl. Jeg læste bare kun ABNF-delen og savnede noterne. Tak for at påpege det!

Svar

Med GNU date (5.90 eller derover):

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

Erstat %N med %3N i millisekunder, %6N i mikrosekunder …

AFAIK, ingen af POSIX-, Unix- eller LSB-specifikationerne angiver nogen kommando, der kan vise tid med sub-sekunders granularitet, men brøkdelen er valgfri i RFC 3339.

POSIX / Unix / LSB strftime understøtter %z for at vise TZ-offset som -0800, så den mest bærbare, du sandsynligvis vil få, er:

 $ 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 

Svar

Du kan også formatere tiden i henhold til RFC3339 (ISO8601) lettere:

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

BEMÆRK: Denne formular at bruges også i Label Schema Convention RC 1.0

Kommentarer

  • At ' ikke er en gyldig RFC3339. Eran ' s svar på “ dato +% Y-% m-% dT% T% z er korrekt og færre tegn. Hvis du vil i UTC-pass -u-flag, hvilket vil nulstille tidszoneforskydningen.
  • Med -u -flagget er dette svar korrekt, ikke?
  • @briceburg hvorfor er dette ikke gyldigt RFC3339? I henhold til tools.ietf.org/html/rfc3339#section-5.6 synes det at være korrekt, så vidt jeg kan se.

Svar

GNU date har ISO-8601-format indbygget – er ikke det ret tæt på eller endog identisk med RFC-3339?

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

Kommentarer

  • ISO-8601 tillader forskellige formattering af datoer og klokkeslæt, men jeg tror, at OP beder specifikt om W3C dato format " Komplet dato plus timer, minutter, sekunder og en decimalfraktion af et sekund ÅÅÅÅ-MM-DDThh: mm: ss.sTZD (f.eks. 1997-07-16T19: 20: 30.45 + 01: 00) " W3C dato- og tidsformater .

Svar

Hvad med gamle gode:

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

Kommentarer

  • Hvor er tidszoneoplysningerne?
  • Dette fungerer både på mac og linux ' date '
  • Hvad med millisekunder?
  • hurtig bemærkning her, uden at åbne RFC, tidszonesegmentet mangler 0200 et kolon, som muligvis bryder nogle systemer, der kræver det.
  • @MikeMackintosh ' s note er relevant; output vist her er ikke en lovlig RFC 3339-dato. Tyktarmen i tidszonsegmentet kræves til RFC 3339; se definitionen af time-numoffset ved tools.ietf.org/html/rfc3339#section-5.6 .

Svar

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" 

Disse kommandoer er POSIX-kompatible, med undtagelse i %z konverteringsspecifikationen. %z understøttes dog bredt og fungerer på samme måde i Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix og Haiku. Det fungerer også med værktøjerne i Busybox, Toybox og sbase (basesystemværktøjerne suckless.org). Da %z udsender tidszoneforskydningen i ±HHMM -format, har vi brug for sed -røret for at tilføje et kolon og skift det til ±HH:MM.

BEMÆRK: Kommandot Heirloom-projektet “s date er inkompatibelt %z output: det udskriver ikke et + tegn.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *