Wat is een standaardopdracht voor het afdrukken van een datum in RFC-3339-indeling?

Het date commando biedt zoiets niet, wat best jammer is aangezien RFC-3339 de modern, wijdverbreid, normaal formaat dat overal wordt gebruikt (behalve in e-mail, dat noch modern noch gezond is).

Mijn tijdzoneverschuiving is momenteel -08: 00, dus de eenvoudigste vorm van dit commando zou de huidige tijd moeten afdrukken als 2013-09-05T14:58:33.102-08:00.

Reacties

  • In welke standaard (s) ben je geïnteresseerd in?
  • Persoonlijk vind ik het prima met GNU, maar in het algemeen zou het echt breder moeten zijn dan dat. Het zou ook moeten komen met een redelijke standaard (korte optie, milliseconde precisie) en een manier hebben om specificeer de subseconde precisie (aantal cijfers anders dan 0 of 9).
  • Het ‘ s niet een normaal formaat: het totaal de afwezigheid van witruimte maakt het onnodig moeilijk voor mensen om te lezen. U moet de kleine variatie 2013-09-05 14:58:33.102 -0800 gebruiken, behalve wanneer ik Dit is een reden waarom spaties helemaal niet gebruikt mogen worden.
  • Ik vergeleek het met het datumnotatie van de mail (RFC 822, 2822), dat moeilijk te lezen is voor zowel mensen als machines.

Answer

Het lijkt erop dat je verschillende formaten kunt gebruiken met de schakelaar naar de GNU-implementatie van date (versie 5.90 of hoger), --rfc3339=.

Voorbeelden

$ 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 

Als je wilt dat T wordt toegevoegd, als een hack:

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

Als je het in milliseconden wilt :

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

Referenties

Reacties

  • Tegenwoordig is er geen hack nodig om de ‘ T ‘. De --iso-8601' option accepts the same arguments as –rfc-3339`, en bevat de ‘ T ‘ in zijn output.
  • Sed deel s/\(\....\).*-/\1-/g zou s/\(\....\).*\([+-]\)/\1\2/g moeten zijn om ook ten oosten van de Atlantische Oceaan te werken.
  • @svante – bedankt voor de details, opgelost.
  • @Eonil dat is eigenlijk niet correct, de RFC3339 zegt: NOTE: ISO 8601 defines date and time separated by "T". Terwijl je met RFC3339 een ruimte. Lees ietf.org/rfc/rfc3339.txt Sectie 5.6
  • @ rwenz3l Mijn schuld. Ik heb net alleen het ABNF-gedeelte gelezen en heb de noten gemist. Bedankt dat je erop hebt gewezen!

Antwoord

Met GNU date (5.90 of hoger):

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

Vervang %N door %3N voor milliseconden, %6N voor microseconden …

AFAIK, geen van de POSIX-, Unix- of LSB-specificaties specificeert een commando dat tijden kan weergeven met sub-seconde granulariteit, maar het fractionele deel is optioneel in RFC 3339.

POSIX / Unix / LSB strftime ondersteunt %z om de TZ-offset weer te geven als -0800, dus de meest draagbare die je waarschijnlijk zult krijgen is:

 $ 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 

Antwoord

U kunt de tijd ook opmaken volgens RFC3339 (ISO8601) eenvoudiger:

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

OPMERKING: Dit formulier at wordt ook gebruikt in de Label Schema Convention RC 1.0

Opmerkingen

  • Dat ‘ is geen geldige RFC3339. Eran ‘ s antwoord van “ datum +% Y-% m-% dT% T% z is correct en bevat minder tekens. Als je in UTC pass -u vlag wilt, die zal de tijdzone-offset op nul zetten.
  • Met de -u vlag is dit antwoord juist, toch?
  • @briceburg waarom is dit geen geldige RFC3339? Volgens tools.ietf.org/html/rfc3339#section-5.6 lijkt het voor zover ik weet correct te zijn.

Answer

GNU date heeft het ISO-8601-formaat ingebouwd – niet dat vrij dicht bij of zelfs identiek aan RFC-3339?

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

Reacties

  • ISO-8601 staat verschillende opmaak van datums en tijden, maar ik denk dat het OP specifiek vraagt om W3C Datum indeling ” Volledige datum plus uren, minuten, seconden en een decimale breuk van een tweede JJJJ-MM-DDTuu: mm: ss.sTZD (bijv. 1997-07-16T19: 20: 30.45 + 01: 00) ” W3C datum- en tijdnotaties .

Antwoord

Hoe zit het met good old:

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

Reacties

  • Waar is de tijdzone-informatie?
  • Dit werkt zowel op mac als linux ‘ date ‘
  • Hoe zit het met milliseconden?
  • korte opmerking hier, zonder de RFC te openen, het tijdzonesegment 0200 mist een dubbele punt, waardoor sommige systemen kunnen breken die dit nodig hebben.
  • @MikeMackintosh ‘ s opmerking is relevant; de hier getoonde uitvoer is niet een wettelijke RFC 3339-datum. De dubbele punt in het tijdzonesegment is vereist voor RFC 3339; zie de definitie van time-numoffset op tools.ietf.org/html/rfc3339#section-5.6 .

Answer

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" 

Deze commandos zijn POSIX-compatibel, met uitzondering van van de %z conversiespecificatie. %z wordt echter breed ondersteund en werkt op dezelfde manier in Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix en Haiku. Het werkt ook met de tools in Busybox, Toybox en sbase (de suckless.org basissysteemhulpprogrammas). Aangezien %z de tijdzoneverschuiving uitvoert in ±HHMM formaat, hebben we de sed pipe nodig om toe te voegen een dubbele punt en verander het in ±HH:MM.

OPMERKING: Het date commando van het Heirloom-project heeft incompatibele %z output: er wordt geen + teken afgedrukt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *