将Linux日期转换为yyyy-MM-dd'T'HH:mm:ss'Z'格式

26
我需要对日期时间值进行参数化,以便将其传递给构建的URI,以便调用Smartsheet API获取在过去24小时内更改的数据(即表格)。我希望使用Linux的date命令,因为我可以执行类似于“date -d '1 day ago' %F”的操作,以获取前一天的输出。如何使用date命令将该值转换为“yyyy-MM-dd'T'HH:mm:ss'Z'”格式,以获得类似于“2018-01-01T00:00:00-07:00”的内容?
如果该值不是特定格式,则Smartsheet API会出现问题:
HTTP_01 - Error fetching resource. Status: 400 Reason: 
Bad Request : { "errorCode" : 1018, "message" : "The value '/home/my/path/to/param_file/Sysdate' was not valid for the parameter modifiedSince.", "refId" : "1xqawd3s94f4y" }

感谢您的信件。

Stack Overflow不是一个代码编写服务。请展示你的代码。由于Stack Overflow会隐藏关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、特定的问题或错误以及重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例 - jww
@jww,你是不是给所有的答案都点了踩?如果是,为什么? - randomir
4个回答

32
为了以ISO 8601格式输出日期,您可能想使用-I[FMT]/--iso-8601[=FMT]选项,如果您的date支持它(GNU/Linux版本支持)。 FMT基本上是一个分辨率,在您的情况下,您将想要使用s表示秒:
$ date -Is
2018-03-09T09:28:14+01:00

(对于POSIX date,包括BSD/OSX date),另一种选择是明确指定格式并输出UTC时区的时间(使用-u标志):

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2018-03-09T08:28:14Z

请注意-u的重要性以及我们可以在这种情况下附加的显式Z。如果没有-u,我们需要以+hh:mm格式输出精确的时区,但是POSIXdate仅支持时区名称输出(%Z)。GNU date通过%:z扩展了格式设置,它输出数值型时区,但如果已经使用GNU date,则第一种方法使用-Is更简单。

5

在您的shell中调用date时,请使用以下格式:

date +"%Y-%m-%dT%H-%M-%SZ"

2018-03-09T07-44-39Z
2018年3月9日07:44:39 Z(协调世界时)

4
请注意,此命令仅在您的本地时区为UTC时打印正确时间。该命令的问题在于它始终打印本地时间并附加硬编码/固定时区-Z。请查看“-u”标志(请参见我的答案)。 - randomir

4
尽可能简短地说:

UTC时间:date -u +"%FT%TZ"

本地时间:date +"%FT%TZ"


1
这是错误的 - Z 是一个指示它是UTC时间戳的标识符。它生成了一个有效的格式,但改变了它的含义。 - Waddles
jadjay的回答很有帮助,但正如@Waddles所指出的那样,它并不完全正确。在Ubuntu上,从man date输出中: %F给我们完整的日期;就像%+4Y-%m-%d一样。 T给我们字符“T”。 %T给我们时间;与%H:%M:%S相同。 Z给我们字符“Z”。这使我们得到了:2022-07-09T12:24:06Z,它是本地时间,而不是Zulu时间。*-u*将其转换为UTC(即Zulu时间)。阅读man date手册以获取更多信息。 - AFK
好的,好的,好的先生们:假设我写了以下代码:date -u +"%FT%TZ" 用于UTC时间 date +"%FT%T" 用于本地时间 - jadjay

2

bash_profile 中使用此别名:

alias utc='date -u +"%Y-%m-%dT%H:%M:%SZ"'

然后,您可以像这样运行它:
$ utc

输出结果将会是:
$ 2021-04-15T01:36:31Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接