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


19

date命令不提供这种功能,这是令人遗憾的,因为RFC-3339是一种现代,广泛,合理的格式,在各处使用(电子邮件既不是现代的也不是明智的)。

我的时区偏移当前为-08:00,因此此命令最简单的形式应将当前时间打印为2013-09-05T14:58:33.102-08:00


您对哪个标准感兴趣?
斯特凡Chazelas

我个人对GNU很好,但是从总体上看,它确实应该比这更广泛。它还应具有合理的默认值(短选项,毫秒精度),并具有指定亚秒级精度(0或9以外的位数)的方法。
Martin Jambon 2014年

1
不是理智的格式:完全没有空格,这使人类不必要地难以阅读。您应该使用细微的变化,2013-09-05 14:58:33.102 -0800除非出于某种原因根本不能使用空格。
zwol 2014年

1
我正在将其与邮件日期格式(RFC 822、2822)进行比较,该格式对于人和机器都很难阅读。
Martin Jambon 2014年

Answers:


30

看来您可以使用切换到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

参考文献


7
如今,不需要黑客就可以获取“ T”。所述--iso-8601' option accepts the same arguments as --rfc-3339`,并且包括在其输出中“T”。
Ti Strga '16

1
sed部分也s/\(\....\).*-/\1-/g应该s/\(\....\).*\([+-]\)/\1\2/g在大西洋以东工作。
svante

1
@svante-感谢您提供详细信息,已修复。
slm

2
@Eonil实际上是不正确的,RFC3339指出:NOTE: ISO 8601 defines date and time separated by "T".尽管RFC3339允许您改用空格。阅读ietf.org/rfc/rfc3339.txt第5.6节
rwenz3l,

1
@ rwenz3l我的错。我只阅读了ABNF部分,却错过了笔记。感谢您指出!
欧尼尔

18

使用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

8

GNU date具有内置的ISO-8601格式-难道与RFC-3339不太接近甚至不相同吗?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601允许使用不同的日期和时间格式,但是我认为OP特别要求W3C日期格式“完整的日期加上小时,分钟,秒和秒的小数部分YYYY-MM-DDThh:mm:ss.sTZD (例如1997-07-16T19:20:30.45 + 01:00)” - W3C日期和时间格式
hakre 2014年

8

好的老怎么样:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

时区信息在哪里?
拉斐尔·阿伦斯

这在Mac和Linux“日期”上均有效
Eran Chetzroni

1
毫秒呢?
2015年

6
在此处快速说明,在不打开RFC的情况下,时区段0200缺少冒号,这可能会破坏某些需要它的系统。
Mike Mackintosh 2015年

2
@MikeMackintosh的注释具有相关性;此处显示的输出不是合法的RFC 3339日期。RFC 3339需要时区段中的冒号;看到的定义time-numoffsettools.ietf.org/html/rfc3339#section-5.6
Mark Amery


0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

这些命令与POSIX兼容,但%z转换规范除外。但是,%z它在Linux,MacOS,FreeBSD,OpenBSD,NetBSD,DragonFlyBSD,Solaris,Minix和Haiku中得到了广泛支持并以相同的方式工作。它还可以与Busybox,Toybox和sbase(suckless.org基本系统实用程序)中的工具一起使用。由于%z±HHMM格式输出时区偏移量,因此我们需要使用sed管道添加冒号并将其更改为±HH:MM

注意:Heirloom项目的date命令具有不兼容的%z输出:它不会打印+符号。

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.