W skrypcie Bash chcę wydrukować aktualną datę i godzinę w formacie ISO 8601 (najlepiej UTC) i wydaje się, że powinno to być tak proste, jak date -I
:
http://ss64.com/bash/date.html
Ale to nie działa na moim Macu:
$ date -I
date: illegal option -- I
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
I rzeczywiście, man date
nie wyświetla tej opcji.
Czy ktoś wie, dlaczego to jest lub jakikolwiek inny (łatwy) sposób drukowania daty w formacie ISO 8601? Dzięki!
2011-08-27
i2011-08-27T18:55:43Z
ISO 8601 formatach. I naprawdę, edycja pytania byłaby bardziej pomocna niż rozproszenie aktualizacji w kilku komentarzach. Przykład tego, co próbujesz wydrukować, byłby idealny.brew
(który używa przedrostka „g”)gdate -I
działało, razem z innymi flagami GNU.Odpowiedzi:
Możesz użyć
date "+%Y-%m-%d"
Aby uzyskać datę w pełni zgodną z ISO-8601 , użyj jednego z następujących formatów:
date -u +"%Y-%m-%dT%H:%M:%SZ"
Wynik:
lub
Wynik:
źródło
date -u +"%Y-%m-%dT%H:%MZ"
właśnie tego szukałem.Z
i+00:00
są takie same (w większości). Dla celów tłumaczenia czasu oba oznaczają UTC. Jednak Anglia jest+00:00
zimą i+01:00
latem (BST).Z
to UTC, a+00:00
to GMT. UTC nie jest strefą czasową i nie ma przesunięcia; offset jest definiowany jako różnica czasu między strefą czasową a czasem UTC, standardem pomiaru czasu. GMT to +00: 00 usunięte z UTC (a BST jest, jak mówisz, +01: 00 usunięte z UTC).Data GNU
date -I
jest taka sama, jakdate +%F
i-Iseconds
, a-Iminutes
także razem z UTC offset.$ date +%F # -I or +%Y-%m-%d 2013-05-03 $ date +%FT%T%z # -Iseconds or +%Y-%m-%dT%H:%M:%S%z 2013-05-03T15:59:24+0300 $ date +%FT%H:%M # -Iminutes or +%Y-%m-%dT%H:%M%z 2013-05-03T15:59+0300
-u
jest jakTZ=UTC
.+00:00
można zastąpićZ
.Są to również prawidłowe formaty daty i godziny ISO 8601:
20130503T15 (%Y%m%dT%M) 2013-05 (%Y%m) 2013-W18 (%Y-W%V) 2013-W18-5 (%Y-W%V-%u) 2013W185 (%YW%V%u) 2013-123 (%Y-%j, ordinal date) 2013 (%Y) 1559 (%H%M) 15 (%H) 15:59:24+03 (UTC offset doesn't have to include minutes)
Te nie są:
2013-05-03 15:59 (T is required in the extended format) 201305 (it could be confused with the YYMMDD format) 20130503T15:59 (basic and exteded formats can't be mixed)
źródło
Krótka alternatywa, która działa zarówno z datą GNU, jak i BSD to:
źródło
date -u +%FT%TZ
ponieważ w UTC przesunięcie i tak byłoby zerowePakiet coreutils zawiera wersje narzędzi w wersji GNU. Żeby zainstalować:
Możesz zobaczyć, co jest dostarczane:
Zauważ, że pochodzi z datą:
To jest standardowe polecenie daty GNU, więc przyjmie przełącznik -I:
źródło
gdate --iso-8601=ns
2016-09-29T16: 54: 23,485230000 + 02: 00Po prostu użyj normalnych
date
opcji formatowania:date '+%Y-%m-%d'
Edycja: aby uwzględnić czas i UTC, są one równoważne:
date -u -Iseconds date -u '+%Y-%m-%dT%k:%M:%S%z'
źródło
To nie jest funkcja Bash, to funkcja
date
binarna. W Linuksie zwykle miałbyś wersję GNU coreutilsdate
, podczas gdy na OSX miałbyś starsze narzędzia BSD. Wersja GNU z pewnością może zostać zainstalowana jako pakiet opcjonalny lub możesz utworzyć własny zamiennik - uważam, że powinien to być prosty, jednoliniowy, np. W Perlu.źródło
Istnieje wstępnie skompilowany
coreutils
pakiet dla systemu Mac OS X dostępny pod adresem:http://rudix.org/packages-abc.html#coreutils .
źródło
Idąc o krok dalej, możesz dodać funkcję do swojego ~ / .bashrc lub ~ / .zshrc, aby dodać
-I
flagę daty :date() { if [ "$1" = "-I" ]; then command date "+%Y-%m-%dT%H:%M:%S%z" else command date "$@" fi }
źródło
Regularnie używam 'date -I' w Linuksie podczas zapisywania plików. np .: dotknij x.
date -I
. Chociaż odpowiednikiem w MacOS jest „data +% F”, wpisywanie za każdym razem, gdy zapisuję plik, jest nieco niewygodne. Więc ustawiłem alias „alias dt = 'data +% F'”, a następnie dotknij x.dt
podaje mi datę.źródło