OS X'te `date` komutu ISO 8601` -I` seçeneğine sahip değil mi?


194

Bir Bash komut dosyasında, geçerli tarih saatini ISO 8601 biçiminde (tercihen UTC) yazdırmak istiyorum ve bu kadar basit olmalı date -I:

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

Ancak bu Mac bilgisayarımda çalışmıyor gibi görünüyor:

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

Gerçekten de man datebu seçeneği listelemiyor.

Bunun neden olduğunu veya tarihi ISO 8601 biçiminde yazdırmamın başka (kolay) bir yolu bilen var mı? Teşekkürler!


2
Açıklığa kavuşturmak için, zaman ve tercihen UTC saat diliminde tam bir ISO 8601 tarihi istiyorum.
Aseem Kishore

Soruyu düzenlemek daha iyidir. Zamanı hangi formatta istiyorsunuz?
Tom Zych

@ Tom: tamam, düzenlendi. Biçime göre, ISO 8601 yeterince spesifik değil mi?
Aseem Kishore

Hayır, ISO 8601 yeterince spesifik değil. Bu standart, çeşitli hassasiyetlerde bir dizi formatı belirtir. Hem 2011-08-27ve 2011-08-27T18:55:43ZISO 8601 biçimleridir. Ve gerçekten, soruyu düzenlemek, güncellemeleri birkaç yoruma dağıtmaktan daha yararlı olacaktır. Yazdırmaya çalıştığınız şeyin bir örneği ideal olacaktır.
Keith Thompson

6
Yüklü olması GNU coreutils kullanılarak brew(önek 'g' kullanır) gdate -Idiğer GNU bayraklarıyla birlikte yaptığı iş.
Joel Purra

Yanıtlar:


348

Kullanabilirsin

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

Veya tamamen ISO-8601 uyumlu bir tarih için aşağıdaki biçimlerden birini kullanın:

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

Çıktı:

2011-08-27T23:22:37Z

veya

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

Çıktı:

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

7
Teknik olarak, "T" önerilir, ancak ISO 8601'de isteğe bağlıdır. "T" yerine boşluk kullanılması şöyle olur: tarih -u + "% Y-% m-% d% H-% M-% SZ"
Basil Bourque

En sonunda! Bunu bash_alias'a ekledim
Christian Bongiorno

Evet, harika cevap Teşekkürler!, Ama date -u +"%Y-%m-%dT%H:%MZ"tam olarak aradım.
ChikuMiku

3
@mbigras: Zve +00:00aynıdır (çoğunlukla). Zamanı çevirmek için her ikisi de UTC anlamına gelir. Ancak İngiltere +00:00kışın ve +01:00yazın (BST).
Jeffrey Hulten

5
@JeffreyHulten: "ikisi de UTC demek" - Nitpick, ancak ZUTC, +00:00GMT. UTC bir saat dilimi değildir ve ofseti yoktur; öteleme, saat ölçümü standardı olan saat dilimi ile UTC arasındaki saat farkı olarak tanımlanır. GMT, UTC'den +00: 00 kaldırılır (ve BST, söylediğiniz gibi, UTC'den +01: 00 kaldırılır).
Amadan

57

GNU tarih olarak date -Iaynıdır date +%Fve -Isecondsve -IminutesUTC ayarı ile de zamanı vardır.

$ 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

-ugibidir TZ=UTC. +00:00ile değiştirilebilir Z.

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

Bunlar ayrıca geçerli ISO 8601 tarih veya saat biçimleridir:

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)

Bunlar değil:

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)

3
+ "% FT% T% z" için yaşasın tam da ihtiyacım olan şey
Noah Yetter

22

Hem GNU hem de BSD tarihinde çalışan kısa bir alternatif:

date -u +%FT%T%z

7
ya da date -u +%FT%TZUTC ofset zaten sıfır olurdu
akostadinov

15

Coreutils paketi, araçların GNU sürümlerini sağlar. Yüklemek:

$ brew install coreutils

Neler sağlandığını görebilirsiniz:

$ brew list coreutils

Tarihle birlikte geldiğine dikkat edin:

$ brew list coreutils | grep date

Bu standart GNU tarih komutudur, bu nedenle -I anahtarını alır:

$ gdate -I
2016-08-09

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

5

Sadece normal datebiçimlendirme seçeneklerini kullanın :

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

Düzenleme: saati ve UTC'yi eklemek için bunlar eşdeğerdir:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'

OP saatime ve tercihen UTC saat diliminde tam tarih istediğimi açıklayan bir yorum eklendi. Yine de bahşiş için teşekkürler!
Aseem Kishore

3

Bash'in bir özelliği değil, dateikiliğin bir özelliği . Linux'ta genellikle GNU coreutils sürümüne sahip dateolursunuz, OSX'te ise BSD eski yardımcı programlarına sahip olursunuz. GNU sürümü kesinlikle isteğe bağlı bir paket olarak kurulabilir, ya da kendi değişiminizi yuvarlayabilirsiniz - Bence basit bir astar olması gerekir, örneğin Perl.


İlginç, teşekkürler. Ben bir çeşit Mac / Linux / Unix / Bash noob; coreutils hakkında ayrıntılı bilgi ve Mac'e nasıl kurarsınız? Teşekkürler!
Aseem Kishore

2

Diğer yanıtları bir adım daha ileri götürerek, ~ / .bashrc veya ~ / .zshrc öğelerinize tarih -Ibayrağı eklemek için bir işlev ekleyebilirsiniz :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.