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

最好只是编辑问题。您想要哪种格式的时间?
汤姆·齐奇

@汤姆:好的,已编辑。按格式,ISO 8601不够具体吗?
2011年

不,ISO 8601不够具体。该标准规定了多种精度的格式。双方2011-08-272011-08-27T18:55:43Z都通过了ISO 8601的格式。实际上,与在多个评论中分散更新相比,编辑问题将更有用。您尝试打印的示例非常理想。
基思·汤普森

6
使用(使用前缀“ g”)安装GNU coreutils以及其他GNU标志都可以正常工作。brewgdate -I
乔尔·普拉

Answers:


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 Bongiorno,

是的,很棒的答案谢谢!,但这date -u +"%Y-%m-%dT%H:%MZ"正是我想要的。
ChikuMiku

3
@mbigras:Z+00:00相同(大部分)。为了翻译时间,它们都表示UTC。但是,英格兰+00:00处于冬季和+01:00夏季(BST)。
杰弗里·赫尔滕

5
@JeffreyHulten:“它们都表示UTC”-Nitpick,但是Z是UTC,而是+00:00GMT。UTC不是时区,没有偏移量。偏移量定义为时区与UTC(时间测量标准)之间的时差。GMT已从UTC移除+00:00(而BST已从UTC移除+01:00)。
阿玛丹'18

57

在GNU中,日期date -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)

3
正是我需要的+“%FT%T%z”
万岁

22

一个适用于GNU和BSD日期的替代方法是:

date -u +%FT%T%z

7
还是date -u +%FT%TZ因为在UTC中偏移量始终为零
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

3

它不是Bash的功能,而是date二进制文件的功能。在Linux上,您通常具有GNU coreutils版本date,而在OSX上,您具有BSD旧版实用程序。GNU版本当然可以作为可选软件包安装,或者您可以自己替换它-我认为它应该是一个简单的单行代码,例如在Perl中。


有趣,谢谢。我有点像Mac / Linux / Unix / Bash新手;您介意coreutils以及如何在Mac上安装它吗?谢谢!
Aseem Kishore

2

进一步解决其他问题,您可以在〜/ .bashrc或〜/ .zshrc中添加一个函数以添加日期-I标记:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.