如何获取格式为 2022-03-17T08:06:20.411493824Z 的日期

如何获取格式为 2022-03-17T08:06:20.411493824Z 的日期

我似乎找不到任何关于如何2022-03-17T08:06:20.411493824Z使用简单的 bash 命令获取日期的简单答案。即当前日期和时间。

我尝试了以下操作,但没有得到多余的数字:

DATE=$(date '+%FT%TZ')

echo $DATE

答案1

如果您正在使用 GNU 查找使用 ISO 8601 格式(纳秒)的 UTC 时间date

date -Ins -u

如果您想要确切的格式,仍然使用 GNU 的 UTC 格式date

date -u +%Y-%m-%dT%H:%M:%S.%NZ

或者

date -u +%FT%T.%NZ

答案2

如果您无法访问 GNU (当单独调用需要几千甚至数百万时,date获得纳秒精度是否有意义),但如果可以选择切换到其他 shell,您可以这样做:date

zsh

TZ=UTC0 print -rP '%D{%FT%T.%9.Z}'

(这里使用通过提示扩展print -P

或者:

zmodload zsh/datetime
TZ=UTC0 strftime %FT%T.%9.Z $epochtime

或者存储在变量中:

TZ=UTC0 print -rPv var '%D{%FT%T.%9.Z}'

或者:

zmodload zsh/datetime
TZ=UTC0 strftime -s var %FT%T.%9.Z $epochtime

或者:

() { local -x TZ=UTC0; var=${(%):-%D{%FT%T.%9.Z}}; }

使用 ksh93:

TZ=UTC0 printf '%(%FT%T.%NZ)T\n'

或者存储在变量中:

var=${ printf '%(%FT%T.%NZ)T'; }

bash几年前确实复制了 的子集,但不ksh93支持纳秒。printf '%(format)T' datespec%N

从 5.0 版本开始,它添加了对zsh 中的$EPOCHSECONDS$EPOCHREALTIME变量(不是$epochtime数组)的支持。仅具有微秒精度,但可能足以满足您的用例:

t=$EPOCHREALTIME; TZ=UTC0 printf "%(%FT%T)T.${t#*.}Z\n" "${t%.*}"

所有这些仅使用内置函数并且不分叉任何进程,因此您应该能够每毫秒运行相当多的进程。

$ repeat 10 TZ=UTC0 print -rP '%D{%FT%T.%9.Z}'
2022-03-17T12:04:56.563450377Z
2022-03-17T12:04:56.563488246Z
2022-03-17T12:04:56.563512375Z
2022-03-17T12:04:56.563530355Z
2022-03-17T12:04:56.563545833Z
2022-03-17T12:04:56.563559764Z
2022-03-17T12:04:56.563575171Z
2022-03-17T12:04:56.563594030Z
2022-03-17T12:04:56.563611980Z
2022-03-17T12:04:56.563626251Z
$ repeat 10 date -u +%FT%T.%NZ
2022-03-17T12:05:28.902806919Z
2022-03-17T12:05:28.905552036Z
2022-03-17T12:05:28.907594864Z
2022-03-17T12:05:28.908563238Z
2022-03-17T12:05:28.909433758Z
2022-03-17T12:05:28.910549552Z
2022-03-17T12:05:28.911642330Z
2022-03-17T12:05:28.912596098Z
2022-03-17T12:05:28.913575587Z
2022-03-17T12:05:28.914538184Z

相关内容