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

19

dateKomenda nie oferuje takiej rzeczy, która jest trochę smutne, ponieważ RFC-3339 to nowoczesny, powszechne, normalny format używany wszędzie (z wyjątkiem wiadomości e-mail, który nie jest ani nowoczesny, ani zdrowy).

Moje przesunięcie strefy czasowej wynosi obecnie -08: 00, więc najprostszą formą tego polecenia powinno być wydrukowanie aktualnego czasu jako 2013-09-05T14:58:33.102-08:00.

Martin Jambon
źródło
Jakimi standardami jesteś zainteresowany?
Stéphane Chazelas,
Osobiście nie mam nic przeciwko GNU, ale w wielkim schemacie rzeczy naprawdę powinno być szersze. Powinien także mieć rozsądną wartość domyślną (krótka opcja, precyzja milisekundowa) i mieć sposób na określenie dokładności drugiej (liczba cyfr inna niż 0 lub 9).
Martin Jambon
1
To nie jest rozsądny format: całkowity brak białych znaków sprawia, że ​​czytanie jest niepotrzebnie trudne. Powinieneś użyć tej niewielkiej zmiany, 2013-09-05 14:58:33.102 -0800chyba że istnieje jakiś powód, dla którego spacje wcale nie powinny być używane.
zwolnienie
1
Porównywałem go do formatu daty poczty (RFC 822, 2822), który jest trudny do odczytania zarówno dla ludzi, jak i maszyn.
Martin Jambon,

Odpowiedzi:

30

Wydaje się, że można zrobić kilka formatów za pomocą przełącznika w celu realizacji GNU date(w wersji 5.90 lub nowszej) --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 Tto dodać, jako hack:

$ 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

Bibliografia

slm
źródło
7
W dzisiejszych czasach hack nie jest potrzebny, aby uzyskać „T”. --iso-8601' option accepts the same arguments as --Rfc-3339` i obejmuje „T” w swojej produkcji.
Ti Strga 23.03.16
1
Częścią sed s/\(\....\).*-/\1-/gpowinna być s/\(\....\).*\([+-]\)/\1\2/gpraca na wschód od Atlantyku.
svante,
1
@svante - naprawiono dzięki za szczegół.
slm
2
@Eonil, który tak naprawdę nie jest poprawny, RFC3339 stwierdza: NOTE: ISO 8601 defines date and time separated by "T".Podczas gdy RFC3339 pozwala zamiast tego użyć spacji. Przeczytaj ietf.org/rfc/rfc3339.txt Sekcja 5.6
rwenz3l
1
@ rwenz3l Moja wina. Właśnie przeczytałem tylko część ABNF i przegapiłem notatki. Dzięki za wskazanie tego!
Eonil,
18

Z GNU date(5.90 lub wyżej):

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

Wymień %Nsię %3Ndo milisekund, %6Ndla mikro sekund ...

AFAIK, żadna ze specyfikacji POSIX, Unix ani LSB nie określa żadnego polecenia, które może wyświetlać czasy z dokładnością poniżej sekundy, ale część ułamkowa jest opcjonalna w RFC 3339.

Strftime POSIX / Unix / LSB obsługuje %zwyświetlanie przesunięcia TZ jako -0800, więc najbardziej przenośny, który prawdopodobnie otrzymasz:

 $ 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
Stéphane Chazelas
źródło
8

GNU datema wbudowany format ISO-8601 - czy to nie jest dość bliskie lub nawet identyczne z RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600
Bruce Ediger
źródło
ISO-8601 dopuszcza różne formaty dat i godzin, ale myślę, że OP prosi konkretnie o format daty W3C „Pełna data plus godziny, minuty, sekundy i ułamek dziesiętny drugiej RRRR-MM-DDThh: mm: ss.sTZD (np. 1997-07-16T19: 20: 30.45 + 01: 00) ” - W3C Formaty daty i godziny .
hakre
8

Co powiesz na dobry stary:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200
Eran Chetzroni
źródło
Gdzie są informacje o strefie czasowej?
Raphael Ahrens
Działa to zarówno na
Macu,
1
Co powiesz na milisekundy?
Martin Jambon
6
szybka uwaga tutaj, bez otwierania RFC, segmentu strefy czasowej, 0200brakuje dwukropka, co może uszkodzić niektóre systemy, które tego wymagają.
Mike Mackintosh
2
@ Uwaga MikeMackintosha jest istotna; pokazane tutaj dane wyjściowe nie są prawidłową datą RFC 3339. Dwukropek w segmencie strefy czasowej jest wymagany dla RFC 3339; patrz definicja time-numoffsetna tools.ietf.org/html/rfc3339#section-5.6 .
Mark Amery
7

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

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

UWAGA: Ten format jest także używany w konwencji schematu etykiet RC RC 1.0

Daniel Andrei Mincă
źródło
To nie jest prawidłowy RFC3339. Odpowiedź Erana na `` data +% Y-% m-% dT% T% z '' jest poprawna i zawiera mniej znaków. Jeśli chcesz w UTC pass -u flag, która wyzeruje przesunięcie strefy czasowej.
Briceburg
Z -uflagą ta odpowiedź jest poprawna, prawda?
Lassi
0
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 %zspecyfikacji konwersji. Jest jednak %zszeroko 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ż %zgeneruje przesunięcie strefy czasowej w ±HHMMformacie, potrzebujemy sedpotoku, aby dodać dwukropek i zmienić go na ±HH:MM.

UWAGA: Projekt Heirloom date ma niekompatybilne %zdane wyjściowe: nie drukuje +znaku.

Lassi
źródło