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

Ase*_*ore 178 macos bash iso8601

在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]
Run Code Online (Sandbox Code Playgroud)

事实上,man date并未列出此选项.

任何人都知道这是为什么,或任何其他(简单)方式让我打印ISO 8601格式的日期?谢谢!

ami*_*t_g 320

你可以用

date "+%Y-%m-%d"
Run Code Online (Sandbox Code Playgroud)

或者,对于完全符合ISO-8601标准的日期,请使用以下格式之一:

date -u +"%Y-%m-%dT%H:%M:%SZ"
Run Code Online (Sandbox Code Playgroud)

输出:

2011-08-27T23:22:37Z
Run Code Online (Sandbox Code Playgroud)

要么

date +%Y-%m-%dT%H:%M:%S%z
Run Code Online (Sandbox Code Playgroud)

输出:

2011-08-27T15:22:37-0800
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,建议使用"T",但在ISO 8601中是可选的.使用空格而不是'T'将是:date -u +"%Y-%m-%d%H-%M-%SZ" (7认同)
  • @JeffreyHulten:"他们俩都是UTC" - Nitpick,但是"Z"是UTC,而"+00:00"是GMT.UTC不是时区,没有偏移量; offset定义为时区与UTC(时间标准)之间的时差.GMT从UTC中删除+00:00(正如您所说,BST从UTC中删除+01:00). (5认同)
  • @mbigras:“ Z”和“ +00:00”相同(大部分情况下)。为了翻译时间,它们都表示UTC。但是,英格兰的冬季为+00:00,夏季为+01:00(BST)。 (2认同)
  • 我应该补充一点,我之前的评论仅指“ISO-8601-1:2019”格式的时间。当提到日期和时间的组合时,[Wiki 页面](https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations) 表示,不再支持使用“T”以外的字符分隔日期和时间。 `ISO-8601-1:2019`,但它在其配置文件中受支持,[RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339)。简而言之,我只是混淆了事情,通常省略 T 就可以了:) 只是添加我注意到的有关新规范的细节。 (2认同)

Lri*_*Lri 56

在GNU中,日期与UTC偏移date -I相同date +%F,-Iseconds并且-Iminutes还包括时间.

$ 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
Run Code Online (Sandbox Code Playgroud)

-u就像TZ=UTC.+00:00可以替换为Z.

$ date -u +%FT%TZ
2013-05-03T12:59:24Z
Run Code Online (Sandbox Code Playgroud)

这些也是有效的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)
Run Code Online (Sandbox Code Playgroud)

这些不是:

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)
Run Code Online (Sandbox Code Playgroud)

  • 万岁为+"%FT%T%z"这正是我所需要的 (3认同)

小智 21

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

date -u +%FT%T%z
Run Code Online (Sandbox Code Playgroud)

  • 或者`date -u +%FT%TZ`因为UTC偏移量无论如何都是零 (7认同)

slm*_*slm 15

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

$ brew install coreutils
Run Code Online (Sandbox Code Playgroud)

你可以看到提供的内容:

$ brew list coreutils
Run Code Online (Sandbox Code Playgroud)

请注意它附带日期:

$ brew list coreutils | grep date
Run Code Online (Sandbox Code Playgroud)

这是标准的GNU日期命令,因此它将采用-I开关:

$ gdate -I
2016-08-09
Run Code Online (Sandbox Code Playgroud)

  • 或:`gdate --iso-8601=ns`:2016-09-29T16:54:23,485230000+02:00 (2认同)

Tom*_*ych 5

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

date '+%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)

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

date -u -Iseconds

date -u '+%Y-%m-%dT%k:%M:%S%z'
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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