以 RFC-3339 格式打印日期的标准命令是什么?

以 RFC-3339 格式打印日期的标准命令是什么?

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

相关内容