2011-08-27 43 views
117

在bash腳本,我要打印的當前日期時間在ISO 8601格式(首選UTC),並且看起來這應該是越簡單date -IOS X上的`date`命令沒有ISO 8601`-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格式的日期?謝謝!

+0

要澄清,我想要一個完整的ISO 8601日期,我包括時間,最好在UTC時區。 –

+0

最好只編輯問題。你想要什麼格式的時間? –

+0

@Tom:好,已編輯。按照格式,ISO 8601是否不夠具體? –

回答

215

你可以使用

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

爲公完全ISO-8601 compliant date,請使用以下格式之一:

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 
+2

從技術上講,推薦使用「T」,但在ISO 8601中是可選的。使用空格而不是「T」將是:date -u +「%Y-%m-%d%H-%M-%SZ」 –

+0

最後!我把這個添加到我的bash_alias –

+0

是的,真棒回答謝謝!,但是這個'date -u +「%Y-%m-%dT%H:%MZ」'正好我在找。 – ChikuMiku

5

只需使用普通date格式化選項:

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

編輯:包括時間和UTC,這是等價的:

date -u -Iseconds 

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

添加評論給我的OP澄清,我想要的完整日期,包括時間,最好在UTC時區。感謝您的提示,但! –

2

這不是猛砸的一個特徵,它是date二進制的一個特徵。在Linux上,您通常會使用GNU coreutils版本date,而在OSX上,您將擁有BSD傳統實用程序。 GNU版本當然可以作爲一個可選的軟件包來安裝,或者你可以推出你自己的替換軟件 - 我相信它應該是一個簡單的單行軟件,例如在Perl中。

+0

有趣,謝謝。我是一種Mac/Linux/Unix/Bash noob;你介意詳細介紹coreutils以及如何在Mac上安裝它?謝謝! –

+0

谷歌似乎表明正規的答案是http://www.macports.org/ – tripleee

41

在GNU日期date -Idate +%F相同,並且-Iseconds-Iminutes也包括具有UTC偏移的時間。

$ 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) 
+1

hooray爲+「%FT%T%z」這正是我所需要的 –

16

這兩個GNU和BSD日工作的一個簡短的選擇是:

date -u +%FT%T%z 
+4

或'日期-u +%FT%TZ',因爲在UTC偏移量中,無論如何爲零 – akostadinov

7

coreutils pa ckage提供了GNU版本的工具。要安裝:

$ brew install coreutils 

你可以看到商提供的內容:

$ brew list coreutils 

注意它帶有日期:

$ brew list coreutils | grep date 

這是標準的GNU date命令所以它會走 - 我切換:

$ gdate -I 
2016-08-09 
+1

或者:'gdate --iso-8601 = ns':2016-09-29T16:54:23,485230000 + 02:00 – Olivier