我似乎找不到任何关于如何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