Polecenie `date` w OS X nie ma opcji ISO 8601` -I`?


205

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 datenie wyświetla tej opcji.

Czy ktoś wie, dlaczego to jest lub jakikolwiek inny (łatwy) sposób drukowania daty w formacie ISO 8601? Dzięki!


2
Aby wyjaśnić, chcę mieć pełną datę ISO 8601, w tym godzinę, a najlepiej w strefie czasowej UTC.
Aseem Kishore

Lepiej jest po prostu edytować pytanie. W jakim formacie chcesz mieć czas?
Tom Zych

@Tom: ok, zredagowano. Czy według formatu ISO 8601 nie jest wystarczająco szczegółowe?
Aseem Kishore

Nie, ISO 8601 nie jest wystarczająco szczegółowe. Norma ta określa szereg formatów o różnych szczegółach. Zarówno 2011-08-27i 2011-08-27T18:55:43ZISO 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.
Keith Thompson

8
Po zainstalowaniu coreutils GNU przy użyciu brew(który używa przedrostka „g”) gdate -Idziałało, razem z innymi flagami GNU.
Joel Purra,

Odpowiedzi:


361

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:

2011-08-27T23:22:37Z

lub

date +%Y-%m-%dT%H:%M:%S%z

Wynik:

2011-08-27T15:22:37-0800

7
Z technicznego punktu widzenia „T” jest zalecane, ale opcjonalne w ISO 8601. Użycie spacji zamiast „T” to: date -u + „% Y-% m-% d% H-% M-% SZ”
Basil Bourque

Wreszcie! Dodałem to do moich bash_alias
Christian Bongiorno

Tak, świetna odpowiedź Dzięki !, ale date -u +"%Y-%m-%dT%H:%MZ"właśnie tego szukałem.
ChikuMiku

3
@mbigras: Zi +00:00są takie same (w większości). Dla celów tłumaczenia czasu oba oznaczają UTC. Jednak Anglia jest +00:00zimą i +01:00latem (BST).
Jeffrey Hulten

5
@JeffreyHulten: "obaj mają na myśli UTC" - Nitpick, ale Zto UTC, a +00:00to 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).
Amadan,

59

Data GNU date -Ijest taka sama, jak date +%Fi -Iseconds, a -Iminutestakż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

-ujest jak TZ=UTC. +00:00można zastąpić Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z

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)

4
brawo dla + "% FT% T% z" właśnie tego potrzebowałem
Noah Yetter

25

Krótka alternatywa, która działa zarówno z datą GNU, jak i BSD to:

date -u +%FT%T%z

8
lub date -u +%FT%TZponieważ w UTC przesunięcie i tak byłoby zerowe
akostadinov

17

Pakiet coreutils zawiera wersje narzędzi w wersji GNU. Żeby zainstalować:

$ brew install coreutils

Możesz zobaczyć, co jest dostarczane:

$ brew list coreutils

Zauważ, że pochodzi z datą:

$ brew list coreutils | grep date

To jest standardowe polecenie daty GNU, więc przyjmie przełącznik -I:

$ gdate -I
2016-08-09

1
Lub:: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02: 00
OlivierLarue

5

Po prostu użyj normalnych dateopcji 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'

Dodano komentarz do mojego OP wyjaśniający, że chcę mieć pełną datę, w tym godzinę, a najlepiej w strefie czasowej UTC. Dzięki za wskazówkę!
Aseem Kishore

3

To nie jest funkcja Bash, to funkcja datebinarna. W Linuksie zwykle miałbyś wersję GNU coreutils date, 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.


Ciekawe, dzięki. Jestem po prostu noobem Mac / Linux / Unix / Bash; czy mógłbyś rozwinąć coreutils i jak go zainstalować na Macu? Dzięki!
Aseem Kishore


2

Idąc o krok dalej, możesz dodać funkcję do swojego ~ / .bashrc lub ~ / .zshrc, aby dodać -Iflagę daty :

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}

0

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. dtpodaje mi datę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.