Jakie jest standardowe polecenie drukowania daty w formacie RFC-3339?

Polecenie date nie oferuje czegoś takiego, co jest trochę smutne, ponieważ RFC-3339 jest nowoczesny, powszechny, rozsądny format używany wszędzie (z wyjątkiem e-maili, które nie są ani nowoczesne, ani rozsądne).

Moje przesunięcie strefy czasowej wynosi obecnie -08:00, więc najprostsza forma tego polecenia powinna wypisać bieżący czas jako 2013-09-05T14:58:33.102-08:00.

Komentarze

  • Który standard (y) Cię interesuje in?
  • Osobiście nie przeszkadza mi GNU, ale w ogólnym rozrachunku to naprawdę powinno być szersze. Powinien również zawierać rozsądną wartość domyślną (krótka opcja, dokładność do milisekund) i mieć sposób na określ dokładność sekundową (liczbę cyfr inną niż 0 lub 9).
  • To ' s nie rozsądny format: suma brak białych znaków sprawia, że czytanie jest niepotrzebnie trudne dla ludzi. Powinieneś użyć niewielkiej odmiany 2013-09-05 14:58:33.102 -0800 z wyjątkiem sytuacji, gdy jest jakiś powód, dla którego spacje nie mogą być w ogóle używane.
  • Porównywałem to z formatem daty poczty (RFC 822, 2822), który jest trudny do odczytania zarówno dla ludzi, jak i dla maszyn.

Odpowiedź

Wygląda na to, że możesz zrobić kilka formatów, używając przełącznika na implementację GNU date (wersja 5.90 lub nowsza), --rfc3339=.

Przykłady

$ 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 

Jeśli chcesz dodać T jako sztuczkę:

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

Jeśli chcesz to w milisekundach :

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

Referencje

Komentarze

  • Obecnie nie jest potrzebny żaden hack, aby uzyskać ' T '. Element --iso-8601' option accepts the same arguments as –rfc-3339` i zawiera ' T ' w swoim
  • Część Sed s/\(\....\).*-/\1-/g powinna być s/\(\....\).*\([+-]\)/\1\2/g, aby działała również na wschód od Atlantyku.
  • @svante – dzięki za szczegóły, naprawione.
  • @Eonil, który w rzeczywistości nie jest poprawny, RFC3339 stwierdza: NOTE: ISO 8601 defines date and time separated by "T". Podczas gdy RFC3339 pozwala na użycie zamiast tego przestrzeń. Przeczytaj ietf.org/rfc/rfc3339.txt Sekcja 5.6
  • @ rwenz3l Moja wina. Po prostu przeczytałem tylko część ABNF i przegapiłem notatki. Dziękujemy za zwrócenie uwagi!

Odpowiedz

Z GNU date (5.90 lub nowszy):

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

Zamień %N na %3N dla milisekund, %6N dla mikro-sekund …

AFAIK, żadna ze specyfikacji POSIX, Unix lub LSB nie określa żadnego polecenia, które może wyświetlać czasy z ziarnistość podsekundowa, ale część ułamkowa jest opcjonalna w RFC 3339.

POSIX / Unix / LSB strftime obsługuje %z, aby wyświetlić przesunięcie TZ jako -0800, więc najbardziej przenośny, jaki prawdopodobnie dostaniesz, to:

 $ 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 

Odpowiedź

Możesz także sformatować czas zgodnie z RFC3339 (ISO8601) :

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

UWAGA: Ten formularz at jest również używany w Konwencji schematu etykiet RC 1.0

Komentarze

  • To ' nie jest prawidłowym RFC3339. Eran ' s odpowiedź „ „ date +% Y-% m-% dT% T% z jest poprawna i zawiera mniej znaków. Jeśli chcesz w UTC flagę pass -u, która wyzeruje przesunięcie strefy czasowej.
  • Z flagą -u odpowiedź jest poprawna, prawda?
  • @briceburg dlaczego to nie jest poprawne RFC3339? Według tools.ietf.org/html/rfc3339#section-5.6 wydaje się być poprawne, o ile wiem.

Odpowiedź

GNU date ma wbudowany format ISO-8601 – czy nie całkiem zbliżone lub nawet identyczne z RFC-3339?

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

Komentarze

  • ISO-8601 dopuszcza różne formatowanie dat i godzin, ale wydaje mi się, że OP pyta konkretnie o format Daty W3C " Pełna data plus godziny, minuty, sekundy i ułamek dziesiętny sekundy RRRR-MM-DDTgg: mm: ss.sTZD (np. 1997-07-16T19: 20: 30.45 + 01: 00) " Formaty daty i godziny W3C .

Odpowiedź

A co powiesz na stare dobre:

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

Komentarze

  • Gdzie są informacje o strefie czasowej?
  • Działa to zarówno na Macu, jak i Linuksie ' date '
  • A co z milisekundami?
  • krótka uwaga, bez otwierania RFC, segmentu strefy czasowej, w 0200 brakuje dwukropka, co może spowodować uszkodzenie niektórych systemów, które tego wymagają.
  • @MikeMackintosh ' s notatka jest trafna; pokazane tutaj dane wyjściowe nie są zgodne z RFC 3339. Dwukropek w segmencie strefy czasowej jest wymagany dla RFC 3339; zobacz definicję time-numoffset w tools.ietf.org/html/rfc3339#section-5.6 .

Odpowiedź

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" 

Te polecenia są zgodne z POSIX, z wyjątkiem specyfikacji konwersji %z. Jednak %z jest szeroko obsługiwany i działa w ten sam sposób w systemach Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix i Haiku. Działa również z narzędziami w Busybox, Toybox i sbase (podstawowe narzędzia systemowe suckless.org). Ponieważ %z wyświetla przesunięcie strefy czasowej w formacie ±HHMM, potrzebujemy potoku sed do dodania dwukropek i zmień go na ±HH:MM.

UWAGA: Polecenie projektu Heirloom „s date ma niezgodne %z wyjście: nie wypisuje znaku +.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *