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

Vla*_*ad 13 linux datetime date smartsheet-api-2.0

我需要参数化日期时间值,目的是传递到构造的 URI 以进行 Smartsheet API 调用以获取过去 24 小时内更改的数据(即工作表)。

我想使用 Linuxdate命令,因为我可以做一些事情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" }
Run Code Online (Sandbox Code Playgroud)

谢谢,

ran*_*mir 18

要以ISO 8601格式输出日期,您可能需要使用-I[FMT]/--iso-8601[=FMT]选项,如果您date支持的话(GNU/Linux 版本支持)。这FMT基本上是一个解决方案,在您的情况下,您需要使用s几秒钟:

$ date -Is
2018-03-09T09:28:14+01:00
Run Code Online (Sandbox Code Playgroud)

替代方案(对于POSIXdate,包括BSD/OSXdate)是明确指定格式并输出UTC时区(-u标志)中的时间:

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2018-03-09T08:28:14Z
Run Code Online (Sandbox Code Playgroud)

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


Evy*_*ged 5

date在 shell 中调用时使用以下格式

date +"%Y-%m-%dT%H-%M-%SZ"
Run Code Online (Sandbox Code Playgroud)

2018-03-09T07-44-39Z

  • 请注意,只有当您的本地时区是 UTC 时,这才会打印正确的时间*。该命令的问题在于它总是打印本地时间并附加硬编码/固定时区 Z。查看“-u”标志(请参阅我的答案)。 (4认同)