Co je standardní příkaz pro tisk data ve formátu RFC-3339?

Příkaz date takovou věc nenabízí, což je trochu smutné, protože RFC-3339 je moderní, rozšířený a rozumný formát používaný všude (s výjimkou e-mailu, který není ani moderní ani rozumný).

Moje časové pásmo je aktuálně -08: 00, takže nejjednodušší forma tohoto příkazu by měla vytisknout aktuální čas jako 2013-09-05T14:58:33.102-08:00.

Komentáře

  • O jaký standard máte zájem in?
  • Osobně jsem s GNU v pořádku, ale ve velkém schématu věcí by to mělo být opravdu širší. Mělo by to také přijít s rozumným výchozím nastavením (krátká volba, milisekundová přesnost) a mít způsob, jak zadejte přesnost subsekundy (počet číslic jiných než 0 nebo 9).
  • To ' s ne rozumný formát: celkový absence mezer znemožňuje lidem zbytečné čtení. Měli byste použít nepatrnou variantu 2013-09-05 14:58:33.102 -0800 kromě případů, kdy je nějaký důvod, proč se mezery nesmí vůbec používat.
  • Porovnával jsem to s formátem data pošty (RFC 822, 2822), který je pro lidi i stroje těžko čitelný.

Odpověď

Vypadá to, že pomocí přechodu na GNU implementaci date (verze 5.90 nebo vyšší), --rfc3339=.

Příklady

$ 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 

Pokud chcete přidat T jako hack:

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

Chcete-li to v milisekundách :

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

Reference

Komentáře

  • K získání ' T '. --iso-8601' option accepts the same arguments as –rfc-3339` a zahrnuje ' T ' v jeho výstup.
  • Sed část s/\(\....\).*-/\1-/g by měla být s/\(\....\).*\([+-]\)/\1\2/g fungovat také na východ od Atlantiku.
  • @svante – díky za detail, opraveno.
  • @Eonil, který ve skutečnosti není správný, uvádí RFC3339: NOTE: ISO 8601 defines date and time separated by "T". Zatímco RFC3339 vám umožňuje použít místo toho místo. Přečtěte si ietf.org/rfc/rfc3339.txt oddíl 5.6
  • @ rwenz3l Moje chyba. Právě jsem četl pouze část ABNF a minul mi poznámky. Děkujeme, že jste na to upozornili!

Odpovědět

S GNU date (5,90 nebo vyšší):

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

Nahraďte %N znakem %3N pro milisekundy, %6N pro mikrosekundy …

AFAIK, žádná ze specifikací POSIX, Unix nebo LSB neurčuje žádný příkaz, který může zobrazit časy pomocí subsekundová granularita, ale zlomková část je volitelná v RFC 3339.

POSIX / Unix / LSB strftime podporuje %z zobrazit TZ offset jako -0800, takže nejpřenositelnější, jaké pravděpodobně získáte, je:

 $ 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 

Odpovědět

Čas můžete také formátovat podle RFC3339 (ISO8601) jednodušší:

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

POZNÁMKA: Tento formulář at se také používá v Konvenci schématu štítků RC 1.0

Komentáře

  • To ' není platný RFC3339. Eran ' s odpovědí na „ datum +% Y-% m-% dT% T% z „ „ je správná a méně znaků. Pokud chcete v UTC předat příznak -u, který vynuluje posun časového pásma.
  • S příznakem -u je tato odpověď správná, že?
  • @briceburg proč to není platné RFC3339? Podle tools.ietf.org/html/rfc3339#section-5.6 se to zdá být správné, pokud vím.

Odpověď

GNU date má zabudovaný formát ISO-8601 – to není docela blízko nebo dokonce identické s RFC-3339?

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

Komentáře

  • ISO-8601 umožňuje různé formátování dat a časů, ale myslím, že OP žádá konkrétně o formát W3C Date " úplné datum plus hodiny, minuty, sekundy a desetinný zlomek sekundy RRRR-MM-DDThh: mm: ss.sTZD (např. 1997-07-16T19: 20: 30,45 + 01: 00) " Formáty data a času W3C .

Odpověď

Co takhle starý dobrý:

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

Komentáře

  • Kde jsou informace o časovém pásmu?
  • Toto funguje v systémech mac i linux ' date '
  • A co milisekundy?
  • rychlá poznámka, bez otevření RFC, segmentu časové zóny, 0200 chybí dvojtečka, což může rozbít některé systémy, které to vyžadují.
  • @MikeMackintosh ' s poznámka je relevantní; zde zobrazený výstup není legální datum RFC 3339. Dvojtečka v segmentu časové zóny je vyžadována pro RFC 3339; viz definice time-numoffset na tools.ietf.org/html/rfc3339#section-5.6 .

Odpověď

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" 

Tyto příkazy jsou kompatibilní s POSIX, s výjimkou specifikace převodu %z. %z je však široce podporován a funguje stejně v systémech Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix a Haiku. Funguje také s nástroji v Busyboxu, Toyboxu a sbase (základní systémové nástroje suckless.org). Protože %z odesílá posun časového pásma ve formátu ±HHMM, potřebujeme přidat sed potrubí dvojtečku a změňte ji na ±HH:MM.

POZNÁMKA: Příkaz projektu Heirloom má date příkaz nekompatibilní %z výstup: nevytiskne znak +.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *