Hva er en standardkommando for å skrive ut en dato i RFC-3339-format?

date -kommandoen tilbyr ikke noe slikt, noe som er litt trist siden RFC-3339 er moderne, utbredt, sunt format som brukes overalt (unntatt i e-post som verken er moderne eller tilregnelig).

Min tidssoneforskyvning er for tiden -08: 00, så den enkleste formen for denne kommandoen skal skrive ut gjeldende tid som div id = «be714d4c7f»>

.

Kommentarer

  • Hvilken standard (s) er du interessert i i?
  • Jeg personlig har det bra med GNU, men i det store ordningen med ting bør det virkelig være bredere enn det. Det bør også komme med en rimelig standard (kort opsjon, millisekund presisjon) og ha en måte å spesifiser presisjonen på andre sekund (antall andre sifre enn 0 eller 9).
  • Det ' s ikke et sunt format: det totale fravær av mellomrom gjør det unødvendig vanskelig for mennesker å lese. Du bør bruke den lille variasjonen 2013-09-05 14:58:33.102 -0800 bortsett fra når det er Det er en eller annen grunn til at mellomrom ikke må brukes i det hele tatt.
  • Jeg sammenlignet det med postdatoformatet (RFC 822, 2822) som er vanskelig å lese for både mennesker og maskiner.

Svar

Det virker som om du kan gjøre flere formater ved å bruke bryteren til GNU-implementering av date (versjon 5.90 eller nyere), --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 vil at T skal legges til, som et hack:

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

Hvis du vil ha det i millisekunder :

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

Referanser

Kommentarer

  • I disse dager er det ikke behov for hack for å få ' T '. --iso-8601' option accepts the same arguments as –rfc-3339`, og inkluderer ' T ' utgang.
  • Sed del s/\(\....\).*-/\1-/g skal være s/\(\....\).*\([+-]\)/\1\2/g for også å jobbe øst for Atlanterhavet.
  • @svante – takk for detaljer, løst.
  • @Eonil som faktisk ikke er riktig, sier RFC3339: NOTE: ISO 8601 defines date and time separated by "T". Mens RFC3339 lar deg bruke en plass i stedet. Les ietf.org/rfc/rfc3339.txt Avsnitt 5.6
  • @ rwenz3l Min feil. Jeg har bare lest bare ABNF-delen og savnet notatene. Takk for at du påpekte det!

Svar

Med GNU date (5.90 eller høyere):

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

Erstatt %N med %3N for millisekunder, %6N i mikrosekunder …

AFAIK, ingen av POSIX-, Unix- eller LSB-spesifikasjonene spesifiserer noen kommando som kan vise tider med del-sekunders granularitet, men brøkdelen er valgfri i RFC 3339.

POSIX / Unix / LSB strftime støtter %z for å vise TZ-forskyvningen som -0800, så den mest bærbare du sannsynligvis kommer til å 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) enklere:

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

MERK: Dette skjemaet at brukes 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 riktig og færre tegn. Hvis du vil i UTC pass -u-flagg, som vil nullstille tidssone-forskyvningen.
  • Med -u -flagget er dette svaret riktig, ikke sant?
  • @briceburg hvorfor er dette ikke gyldig RFC3339? I følge tools.ietf.org/html/rfc3339#section-5.6 ser det ut til å være riktig så vidt jeg kan se.

Svar

GNU date har ISO-8601-format innebygd – er ikke det ganske nær eller identisk med RFC-3339?

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

Kommentarer

  • ISO-8601 tillater forskjellige formatting av datoer og klokkeslett, men jeg tror at OP ber spesielt om W3C Date format " Komplett dato pluss timer, minutter, sekunder og en desimalbrøk av et sekund ÅÅÅÅ-MM-DDThh: mm: ss.sTZD (f.eks. 1997-07-16T19: 20: 30.45 + 01: 00) " W3C dato- og tidsformater .

Svar

Hva med gamle gode:

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

Kommentarer

  • Hvor er tidssoneinformasjonen?
  • Dette fungerer både på mac og linux ' date '
  • Hva med millisekunder?
  • rask merknad her, uten å åpne RFC, mangler tidssonesegmentet 0200 et kolon, som kan bryte noen systemer som krever det.
  • @MikeMackintosh ' s merknad er relevant; utdataene som vises her er ikke en lovlig RFC 3339-dato. Tykktarmen i tidssonesegmentet kreves for RFC 3339; se definisjonen av 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 kommandoene er POSIX-kompatible, med unntak av %z konverteringsspesifikasjonen. Imidlertid støttes %z og fungerer på samme måte i Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix og Haiku. Det fungerer også med verktøyene i Busybox, Toybox og sbase (suckless.org basesystemverktøy). Siden %z sender ut tidssoneforskyvningen i ±HHMM -format, trenger vi sed -røret for å legge til et kolon og endre det til ±HH:MM.

MERK: Kommandot Heirloom-prosjektet «s date har inkompatibel %z utgang: det skriver ikke ut et + -tegn.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *