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
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 +
.
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.