在 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 格式打印日期吗?谢谢!
你可以使用
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
在 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)
适用于 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
只需使用正常的
date
格式选项:
date '+%Y-%m-%d'
编辑:包括时间和 UTC,这些是等效的:
date -u -Iseconds
date -u '+%Y-%m-%dT%k:%M:%S%z'
进一步采取其他答案,您可以向 ~/.bashrc 或 ~/.zshrc 添加一个函数来添加日期
-I
标志:
date() {
if [ "$1" = "-I" ]; then
command date "+%Y-%m-%dT%H:%M:%S%z"
else
command date "$@"
fi
}
这不是 Bash 的功能,而是
date
二进制文件的功能。在 Linux 上,您通常会拥有 GNU coreutils 版本的 date
,而在 OSX 上,您会拥有 BSD 遗留实用程序。 GNU 版本当然可以作为可选包安装,或者您可以推出自己的替代品 - 我相信它应该是一个简单的单行例如在 Perl 中。
我在 Linux 中保存文件时经常使用“date -I”。例如:触摸 x。
date -I
。虽然 MacOS 中的等效项是“date +%F”,但每次保存文件时都键入有点尴尬。因此,我设置了一个别名“alias dt='date +%F'”,然后触摸 x。dt
给了我日期。
很多年后,但在 macOS 12 (Monterey) 中
man date
确实包含 -I
选项,但它会生成相同的错误,除非你进一步挖掘并找到
date -u -I seconds
2023-08-04T03:59:20+00:00
我注意到它不会在末尾附加“Z”,但
-u
选项确实使其以 UTC 格式输出。