该date
命令不提供这样的东西,这有点令人遗憾,因为 RFC-3339 是到处使用的现代、广泛、健全的格式(除了电子邮件,它既不现代也不健全)。
我的时区偏移量当前为 -08:00,因此此命令的最简单形式应将当前时间打印为2013-09-05T14:58:33.102-08:00
.
答案1
似乎您可以使用切换到 GNU 实现date
(版本 5.90 或更高版本)来处理多种格式--rfc3339=
。
例子
$ date --rfc-3339=date
2014-03-19
$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00
$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00
如果你想T
添加,作为一个黑客:
$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00
如果你想要以毫秒为单位:
$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00
参考
答案2
使用 GNU date
(5.90 或更高版本):
$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00
替换%N
为%3N
毫秒、%6N
微秒...
AFAIK,POSIX、Unix 或 LSB 规范都没有指定任何可以以亚秒粒度显示时间的命令,但小数部分在 RFC 3339 中是可选的。
POSIX/Unix/LSB strftime 支持%z
将 TZ 偏移量显示为-0800
,因此您可能会得到的最便携的是:
$ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
localtime; $t =~ s/..$/:$&/; print $t'
2014-03-19T14:30:23-08:00
答案3
您还可以根据格式设置时间RFC3339(ISO8601)更轻松:
$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z
笔记:这种格式也用在标签模式约定 RC 1.0
答案4
GNUdate
内置了 ISO-8601 格式 - 这不是与 RFC-3339 非常接近甚至相同吗?
1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600