241

在 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 格式打印日期的任何其他(简单)方式?谢谢!

4

9 回答 9

406

你可以使用

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
于 2011-08-27T18:12:30.290 回答
65

在 GNU 中 datedate -I与 相同date +%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)
于 2013-05-03T14:11:04.427 回答
27

适用于 GNU 和 BSD 日期的简短替代方法是:

date -u +%FT%T%z
于 2015-12-07T16:27:58.047 回答
24

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

$ brew install coreutils

您可以查看提供的内容:

$ brew list coreutils

注意它带有日期:

$ brew list coreutils | grep date

这是标准的 GNU 日期命令,因此需要 -I 开关:

$ gdate -I
2016-08-09
于 2016-08-09T16:29:29.447 回答
7

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

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

编辑:包括时间和UTC,这些是等效的:

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
于 2011-08-27T18:11:54.917 回答
3

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

于 2011-08-27T18:14:58.897 回答
3

将其他答案更进一步,您可以向 ~/.bashrc 或 ~/.zshrc 添加一个函数来添加日期-I标志:

date() {
  if [ "$1" = "-I" ]; then
    command date "+%Y-%m-%dT%H:%M:%S%z"
  else
  command date "$@"
  fi
}
于 2018-10-11T12:55:49.893 回答
2

有一个coreutils用于 Mac OS X 的预编译包,位于:

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

于 2011-08-28T10:03:10.720 回答
0

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

于 2020-08-16T11:32:19.307 回答