Perintah `date` pada OS X tidak memiliki opsi ISO 8601` -I`?

194

Dalam skrip Bash, saya ingin mencetak datetime saat ini dalam format ISO 8601 (lebih disukai UTC), dan sepertinya ini sesederhana date -I:

http://ss64.com/bash/date.html

Tapi ini sepertinya tidak berfungsi di Mac saya:

$ 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]

Dan memang, man datetidak mencantumkan opsi ini.

Adakah yang tahu mengapa ini, atau cara lain (mudah) bagi saya untuk mencetak tanggal dalam format ISO 8601? Terima kasih!

Aseem Kishore
sumber
2
Untuk memperjelas, saya ingin tanggal ISO 8601 lengkap, termasuk waktu, dan lebih disukai di zona waktu UTC.
Aseem Kishore
Lebih baik mengedit pertanyaan. Format apa yang Anda inginkan?
Tom Zych
@ Tom: oke, sudah diedit. Dengan format, apakah ISO 8601 tidak cukup spesifik?
Aseem Kishore
Tidak, ISO 8601 tidak cukup spesifik. Standar itu menetapkan sejumlah format berbagai presisi. Keduanya 2011-08-27dan 2011-08-27T18:55:43Zmerupakan format ISO 8601. Dan sungguh, mengedit pertanyaan akan lebih bermanfaat untuk melakukan scatting pembaruan di beberapa komentar. Contoh dari apa yang Anda coba cetak akan ideal.
Keith Thompson
6
Setelah menginstal GNU coreutils menggunakan brew(yang menggunakan awalan 'g') gdate -Iberhasil, bersama dengan flag GNU lainnya.
Joel Purra

Jawaban:

348

Anda bisa menggunakannya

date "+%Y-%m-%d"

Atau untuk tanggal yang sepenuhnya sesuai dengan ISO-8601 , gunakan salah satu format berikut:

date -u +"%Y-%m-%dT%H:%M:%SZ"

Keluaran:

2011-08-27T23:22:37Z

atau

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

Keluaran:

2011-08-27T15:22:37-0800
amit_g
sumber
7
Secara teknis, "T" direkomendasikan tetapi opsional dalam ISO 8601. Menggunakan spasi alih-alih 'T' adalah: date -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque
Akhirnya! Saya menambahkan ini ke bash_alias saya
Christian Bongiorno
Yup, jawaban yang luar biasa Terima kasih !, tapi ini date -u +"%Y-%m-%dT%H:%MZ"sebenarnya yang saya cari.
ChikuMiku
3
@ Mbigras: Zdan +00:00sama (kebanyakan). Untuk keperluan penerjemahan waktu, keduanya berarti UTC. Namun Inggris berada +00:00di musim dingin dan +01:00musim panas (BST).
Jeffrey Hulten
5
@JeffreyHulten: "keduanya berarti UTC" - Nitpick, tetapi ZUTC, sedangkan +00:00GMT. UTC bukan zona waktu dan tidak memiliki offset; offset didefinisikan sebagai perbedaan waktu antara zona waktu dan UTC, standar pengukuran waktu. GMT +00: 00 dihapus dari UTC (dan BST, seperti yang Anda katakan, +01: 00 dihapus dari UTC).
Amadan
57

Dalam GNU tanggal date -Isama dengan date +%F, dan -Isecondsdan -Iminutesjuga termasuk waktu dengan 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

-useperti TZ=UTC. +00:00dapat diganti dengan Z.

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

Ini juga merupakan format tanggal atau waktu ISO 8601 yang valid:

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)

Ini bukan:

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)
Lri
sumber
3
hore untuk + "% FT% T% z" itulah yang saya butuhkan
Noah Yetter
22

Alternatif singkat yang bekerja pada tanggal GNU dan BSD adalah:

date -u +%FT%T%z
Beberapa pria
sumber
7
atau date -u +%FT%TZkarena di UTC offset akan menjadi nol pula
akostadinov
15

Paket coreutils menyediakan alat versi GNU. Untuk memasang:

$ brew install coreutils

Anda dapat melihat apa yang disediakan:

$ brew list coreutils

Perhatikan itu datang dengan tanggal:

$ brew list coreutils | grep date

Ini adalah perintah tanggal GNU standar sehingga ia akan beralih -I:

$ gdate -I
2016-08-09
slm
sumber
1
Atau:: gdate --iso-8601=ns2016-09-29T16: 54: 23,485230000 + 02:00
Olivier
5

Cukup gunakan dateopsi pemformatan normal :

date '+%Y-%m-%d'

Edit: untuk memasukkan waktu dan UTC, ini setara:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
Tom Zych
sumber
Menambahkan komentar pada OP saya yang mengklarifikasi bahwa saya menginginkan tanggal lengkap, termasuk waktu, dan lebih disukai di zona waktu UTC. Terima kasih atas tipnya!
Aseem Kishore
3

Ini bukan fitur Bash, ini fitur datebiner. Di Linux Anda biasanya memiliki versi GNU coreutils date, sedangkan pada OSX Anda akan memiliki utilitas warisan BSD. Versi GNU tentu dapat diinstal sebagai paket opsional, atau Anda dapat melempar pengganti Anda sendiri - saya percaya itu harus sederhana misalnya satu-liner misalnya di Perl.

tripleee
sumber
Menarik, terima kasih. Saya semacam Mac / Linux / Unix / Bash noob; maukah Anda menguraikan coreutils dan bagaimana cara menginstalnya pada Mac? Terima kasih!
Aseem Kishore
2

Mengambil jawaban lain satu langkah lebih jauh, Anda bisa menambahkan fungsi ke ~ / .bashrc atau ~ / .zshrc Anda untuk menambahkan -Iflag tanggal :

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