OS X上的“date”命令没有ISO 8601的“-I”选项?

在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格式打印日期吗?谢谢!

106021 次浏览

只需使用普通的date格式化选项:

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

编辑:包括时间和UTC,它们是等价的:

date -u -Iseconds


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

你可以用

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

它不是Bash的特性,而是date二进制文件的特性。在Linux上,你通常会有date的GNU coreutils版本,而在OSX上,你会有BSD遗留实用程序。GNU版本当然可以作为一个可选包安装,或者你也可以自行替换——我相信它应该是一个简单的一行程序,例如用Perl编写的。

有一个预编译的Mac OS X coreutils包可用:

http://rudix.org/packages-abc.html#coreutils

在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)

在GNU和BSD上都可以工作的一个简短的替代方案是:

date -u +%FT%T%z

coreutils包提供了GNU版本的工具。如何安装:

$ brew install coreutils

你可以看到提供了什么:

$ brew list coreutils

注意它带有日期:

$ brew list coreutils | grep date

这是标准的GNU日期命令,所以它将使用-I开关:

$ gdate -I
2016-08-09

进一步考虑其他答案,您可以在~/中添加一个函数。Bashrc或~/。添加日期-I标志:

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

我经常在Linux中使用date -I来保存文件。触摸x.date -I。虽然在MacOS中等效的是“date +%F”,但每次保存文件时输入它有点尴尬。因此,我设置了一个别名&;别名dt='date +%F';然后触摸x.dt给我日期。