Vad är ett standardkommando för att skriva ut ett datum i RFC-3339-format?

Kommandot date erbjuder inte sådant, vilket är lite tråkigt eftersom RFC-3339 är modernt, utbrett, förnuftigt format som används överallt (utom i e-post som varken är modernt eller förnuftigt).

Min tidszonsförskjutning är för närvarande -08: 00 så den enklaste formen av detta kommando bör skriva ut aktuell tid som 2013-09-05T14:58:33.102-08:00.

Kommentarer

  • Vilken standard (s) är du intresserad in?
  • Jag personligen har det bra med GNU men i det stora ordningen bör det verkligen vara bredare än så. Det borde också komma med en rimlig standard (kort alternativ, millisekundprecision) och ha ett sätt att ange precisionsundervisningen (antal andra siffror än 0 eller 9).
  • Det ' s inte ett förnuftigt format: det totala frånvaro av tomrum gör det onödigt svårt för människor att läsa. Du bör använda den lilla variationen 2013-09-05 14:58:33.102 -0800 utom när det finns Det är en anledning till varför utrymmen inte får användas alls.
  • Jag jämförde det med e-postdatumformatet (RFC 822, 2822) som är svårläst för både människor och maskiner.

Svar

Det verkar som om du kan göra flera format med växeln till GNU-implementeringen av date (version 5.90 eller senare), --rfc3339=.

Exempel

$ 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 

Om du vill att T ska läggas till, som ett hack:

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

Om du vill ha det på millisekunder :

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

Referenser

Kommentarer

  • Dessa dagar behövs inget hack för att få ' T '. --iso-8601' option accepts the same arguments as –rfc-3339` och innehåller ' T ' output.
  • Sed del s/\(\....\).*-/\1-/g bör vara s/\(\....\).*\([+-]\)/\1\2/g för att också arbeta öster om Atlanten.
  • @svante – tack för detaljerna, fixade.
  • @Eonil som faktiskt inte är korrekt säger RFC3339: NOTE: ISO 8601 defines date and time separated by "T". Medan RFC3339 låter dig använda en utrymme istället. Läs ietf.org/rfc/rfc3339.txt Avsnitt 5.6
  • @ rwenz3l Mitt fel. Jag läste bara ABNF-delen och saknade anteckningarna. Tack för att ni påpekade det!

Svar

Med GNU date (5.90 eller högre):

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

Ersätt %N med %3N för millisekunder, %6N i mikrosekunder …

AFAIK, ingen av POSIX-, Unix- eller LSB-specifikationerna anger något kommando som kan visa gånger med sub-sekunders granularitet, men bråkdelen är valfri i RFC 3339.

POSIX / Unix / LSB strftime stöder %z för att visa TZ-offset som -0800, så den mest bärbara du förmodligen kommer att få är:

 $ 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 också formatera tiden enligt RFC3339 (ISO8601) enklare:

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

OBS: Det här formuläret at används också i Label Schema Convention RC 1.0

Kommentarer

  • Att ' inte är en giltig RFC3339. Eran ' s svar på ” datum +% Y-% m-% dT% T% z är korrekt och färre tecken. Om du vill ha UTC-pass -u-flaggan, vilket kommer att nollställa tidszonsförskjutningen.
  • Med -u -flaggan är svaret korrekt, eller hur?
  • @briceburg varför är detta inte giltigt RFC3339? Enligt tools.ietf.org/html/rfc3339#section-5.6 verkar det vara så vitt jag kan säga.

Svar

GNU date har ISO-8601-format inbyggt – är inte det ganska nära eller till och med identiskt med RFC-3339?

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

Kommentarer

  • ISO-8601 tillåter olika formatting av datum och tider, men jag tror att OP frågar specifikt för W3C Date format " Komplett datum plus timmar, minuter, sekunder och en decimalfraktion av en sekund ÅÅÅÅ-MM-DDThh: mm: ss.sTZD (t.ex. 1997-07-16T19: 20: 30.45 + 01: 00) " W3C datum- och tidsformat .

Svar

Vad sägs om gamla gamla:

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

Kommentarer

  • Var är tidszoninformationen?
  • Detta fungerar både på mac och linux ' date '
  • Vad sägs om millisekunder?
  • snabb anteckning här, utan att öppna RFC, tidszonsegmentet, 0200 saknas ett kolon, vilket kan bryta vissa system som kräver det.
  • @MikeMackintosh ' s anteckning är relevant; produktionen som visas här är inte ett lagligt RFC 3339-datum. Kolon i tidszonsegmentet krävs för RFC 3339; se definitionen av time-numoffset vid 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" 

Dessa kommandon är POSIX-kompatibla, med undantag i konverteringsspecifikationen %z. %z stöds dock allmänt och fungerar på samma sätt i Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix och Haiku. Det fungerar också med verktygen i Busybox, Toybox och sbase (suckless.org bas systemverktyg). Eftersom %z matar ut tidszonsförskjutningen i ±HHMM -format behöver vi sed -röret för att lägga till en kolon och ändra den till ±HH:MM.

OBS: kommandot Heirloom-projektet ”s date är inkompatibelt %z -utgång: det skriver inte ut ett + -tecken.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *