Mikä on vakiokomento päivämäärän tulostamiseksi RFC-3339-muodossa?

date -komento ei tarjoa sellaista, mikä on surullista, koska RFC-3339 on moderni, laajalle levinnyt, järkevä muoto, jota käytetään kaikkialla (paitsi sähköpostissa, joka ei ole nykyaikainen eikä järkevä).

Aikavyöhykkeen siirtymäni on tällä hetkellä -08: 00, joten tämän komennon yksinkertaisen muodon pitäisi tulostaa nykyinen aika muodossa div id = ”be714d4c7f”>

.

Kommentit

  • mitkä standardit olet kiinnostuneita sisään?
  • Olen henkilökohtaisesti hieno GNU: n kanssa, mutta suuressa asioiden järjestelmässä sen pitäisi todellakin olla laajempi. Sen pitäisi myös sisältää kohtuullinen oletusarvo (lyhyt vaihtoehto, millisekunnin tarkkuus) ja oltava tapa määritä sekunnin tarkkuus (muiden numeroiden kuin 0 tai 9 lukumäärä).
  • Se ’ s ei järkevä muoto: kokonaismäärä välilyönnin puuttuminen tekee ihmisten lukemisen tarpeettomaksi. Käytä pientä variaatiota 2013-09-05 14:58:33.102 -0800 paitsi silloin, kun s jostain syystä, miksi välilyöntejä ei saa käyttää lainkaan.
  • Verrin sitä postituspäivämuotoon (RFC 822, 2822), jota on vaikea lukea sekä ihmisille että koneille.

Vastaus

Vaikuttaa siltä, että voit tehdä useita muotoja siirtymällä date (versio 5.90 tai uudempi), --rfc3339=.

Esimerkkejä

$ 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 

Jos haluat, että T lisätään hakata, hakkerina:

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

Jos haluat sen millisekunteina :

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

Viitteet

kommentit

  • Nykyään ei tarvitse hakata, jotta ’ T ’. --iso-8601' option accepts the same arguments as –rfc-3339` ja sisältää ’ T ’ ulostulo.
  • Sed-osan s/\(\....\).*-/\1-/g tulisi olla s/\(\....\).*\([+-]\)/\1\2/g, jotta se toimisi myös Atlantin itäpuolella.
  • @svante – kiitos yksityiskohdista, korjattu.
  • @Eonil, joka ei oikeastaan ole oikein, RFC3339: ssä sanotaan: NOTE: ISO 8601 defines date and time separated by "T". Vaikka RFC3339: n avulla voit käyttää sen sijaan tilaa. Lue ietf.org/rfc/rfc3339.txt osio 5.6
  • @ rwenz3l Minun vikani. Luin vain ABNF-osan ja kaipasin muistiinpanoja. Kiitos, että osoitit sen!

Vastaa

GNU: lla date (5.90 tai uudempi):

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

Korvaa %N sanoilla %3N millisekunnin ajan, %6N mikrosekunnin ajan …

AFAIK, mikään POSIX-, Unix- tai LSB-määrityksistä ei määritä komentoa, joka voi näyttää ajat alisekunnin tarkkuus, mutta murto-osa on valinnainen RFC 3339: ssä.

POSIX / Unix / LSB-strftime tukee %z TZ-siirtymän näyttämiseksi muodossa -0800, joten kaikkein kannettavin, jonka todennäköisesti saat:

 $ 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 

Vastaa

Voit myös muotoilla ajan RFC3339 (ISO8601) -asetuksen mukaan helpommin:

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

HUOMAUTUS: Tämä lomake at käytetään myös Label Schema Convention RC 1.0

-kommenteissa

  • Tämä ’ ei ole kelvollinen RFC3339. Eran ’ vastaus päivämäärä +% Y-% m-% dT% T% z on oikea ja vähemmän merkkejä. Jos haluat UTC-pass -u-lipun, joka nollaa aikavyöhykkeen siirtymän.
  • -u -merkinnällä tämä vastaus on oikea, eikö?
  • @briceburg miksi tämä ei ole kelvollinen RFC3339? tools.ietf.org/html/rfc3339#section-5.6 mukaan se näyttää olevan oikea niin pitkälle kuin voin kertoa.

Vastaa

GNU date on sisäänrakennettu ISO-8601-muoto – ei ”t melko lähellä tai jopa identtinen RFC-3339: n kanssa?

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

Kommentit

  • ISO-8601 sallii eri päivämäärien ja aikojen muotoilut, mutta mielestäni OP pyytää nimenomaisesti W3C Date -muotoa ” Täydellinen päivämäärä plus tunnit, minuutit, sekunnit ja a sekunnin desimaaliosa VVVV-KK-PPNThh: mm: ss.sTZD (esim. 1997-07-16T19: 20: 30.45 + 01: 00) ” W3C päivämäärä- ja aikamuodot .

vastaus

Entä vanha:

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

Kommentit

  • Missä aikavyöhyketiedot ovat?
  • Tämä toimii sekä Mac- että Linux-käyttöjärjestelmissä ’ date ’
  • Entä millisekunnit?
  • pikahuomautus tässä avaamatta RFC: tä, aikavyöhykesegmentistä 0200 puuttuu kaksoispiste, mikä saattaa rikkoa joitain sitä vaativia järjestelmiä.
  • @MikeMackintosh ’ huomautus on osuva; tässä esitetty tulos ei ole laillinen RFC 3339 -päivämäärä. Aikavyöhykesegmentin kaksoispiste vaaditaan RFC 3339: lle; katso time-numoffset -kohdan määritelmä osoitteesta tools.ietf.org/html/rfc3339#section-5.6 .

Vastaa

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" 

Nämä komennot ovat POSIX-yhteensopivia, lukuun ottamatta %z -muunnosmäärityksen. %z on kuitenkin laajalti tuettu ja toimii samalla tavalla Linuxissa, MacOS: ssa, FreeBSD: ssä, OpenBSD: ssä, NetBSD: ssä, DragonFlyBSD: ssä, Solarisissa, Minixissä ja Haikussa. Se toimii myös Busyboxin, Toyboxin ja sbasen (suckless.org-perusjärjestelmän apuohjelmien) työkalujen kanssa. Koska %z antaa aikavyöhykesiirron ±HHMM -muodossa, meidän on lisättävä sed -putki kaksoispiste ja vaihda se muotoon ±HH:MM.

HUOMAUTUS: Heirloom-projektin ”s date -komennossa ei ole yhteensopivaa %z -lähtö: se ei tulosta + -merkkiä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *