OS Xの `date`コマンドにISO 8601` -I`オプションがありませんか?


193

Bashスクリプトで、現在の日時をISO 8601形式(できればUTC)で出力したいのですが、これは次のように簡単なはずですdate -I

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

しかし、これは私のMacではうまくいかないようです:

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

そして、実際にman dateは、このオプションは記載されていません。

これがなぜ、または私がISO 8601形式で日付を印刷する他の(簡単な)方法であるかを誰かが知っていますか?ありがとう!


2
明確にするために、時刻を含む完全なISO 8601日付、できればUTCタイムゾーンが必要です。
Aseem Kishore 2011

質問を編集することをお勧めします。時間をどの形式にしたいですか?
Tom Zych、2011

@トム:わかりました、編集しました。形式では、ISO 8601は十分に具体的ではありませんか?
Aseem Kishore 2011

いいえ、ISO 8601は十分に具体的ではありません。その規格は、さまざまな精度のいくつかのフォーマットを指定しています。2011-08-272011-08-27T18:55:43ZはどちらもISO 8601形式です。そして本当に、質問を編集することは、いくつかのコメントにわたって更新をスキャッティングするよりも役立つでしょう。印刷しようとしているものの例が理想的です。
Keith Thompson

6
インストールされたGNUのcoreutilsのを使用してbrew(接頭辞「G」を使用する)gdate -I他のGNUフラグと一緒に、仕事をしました。
Joel Purra 2013

回答:


348

あなたは使うことができます

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

または、ISO-8601に完全に準拠した日付の場合は、次のいずれかの形式を使用します。

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

出力:

2011-08-27T23:22:37Z

または

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

出力:

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

7
技術的には、「T」が推奨されますが、ISO 8601ではオプションです。「T」の代わりにスペースを使用すると、次のようになります。date-u + "%Y-%m-%d%H-%M-%SZ"
バジルブルク

最後に!これをbash_aliasに追加しました
Christian

うん、すごい答えありがとうございます!しかし、これはdate -u +"%Y-%m-%dT%H:%MZ"まさに私が探していたものです。
ChikuMiku、2017年

3
@mbigras:Z+00:00(ほとんど)同じです。時間を変換するために、どちらもUTCを意味します。ただし、イングランドは+00:00冬と+01:00夏(BST)です。
Jeffrey Hulten、2017年

5
@JeffreyHulten:「どちらもUTCを意味します」-NitpickですがZ、UTCであり、+00:00GMTです。UTCはタイムゾーンではなく、オフセットもありません。オフセットは、タイムゾーンとUTC(時間測定の標準)の間の時間差として定義されます。GMTは+00:00からUTCから削除されています(そして、BSTは+01:00からUTCから削除されています)。
アマダン

57

GNU日付でdate -I同じでdate +%Fあり、-Isecondsおよび-IminutesUTCオフセットにも時間が含まれます。

$ 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のようTZ=UTCです。+00:00と置き換えることができますZ

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

これらは、有効な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)

これらは:

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"の
Noah Yetter

22

GNUとBSDの両方の日付で機能する短い代替は次のとおりです。

date -u +%FT%T%z

7
またはdate -u +%FT%TZUTCのオフセットがとにかくゼロになるため
akostadinov

15

coreutilsパッケージは、GNUバージョンのツールを提供します。インストールするには:

$ brew install coreutils

何が提供されているかを確認できます。

$ brew list coreutils

日付が付いていることに注意してください。

$ brew list coreutils | grep date

これは標準のGNU dateコマンドであるため、-Iスイッチを使用します。

$ gdate -I
2016-08-09

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

5

通常のdateフォーマットオプションを使用するだけです。

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

編集:時間とUTCを含めるには、これらは同等です:

date -u -Iseconds

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

OPに、時間を含む完全な日付、できればUTCタイムゾーンでの日付が必要であることを明確にするコメントを追加しました。ヒントをありがとう!
Aseem Kishore 2011

3

これはBashの機能ではなく、dateバイナリの機能です。Linuxでは通常、GNU coreutilsバージョンのを使用しdateますが、OSXではBSDレガシーユーティリティを使用します。GNUバージョンは、オプションのパッケージとしてインストールすることもできますが、独自の代替品を用意することもできます。たとえば、Perlのような単純なワンライナーである必要があります。


興味深い、ありがとう。私は一種のMac / Linux / Unix / Bash noobです。coreutilsとMacへのインストール方法について詳しく説明していただけませんか?ありがとう!
Aseem Kishore 2011

2

他の回答をさらに一歩進めて、〜/ .bashrcまたは〜/ .zshrcに関数を追加して、日付-Iフラグを追加できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.