我需要在毫秒末尾附加以下格式的时区值,示例如下:
2018-01-07T14:30:03.832-0700
我需要 Unix 命令来获取所需的格式。
答案1
使用 GNU 或 ast-open date
:
$ date +%FT%T.%3N%z
2018-07-01T13:44:07.043+0100
(GNU date
(不是 GNU strftime
)还支持%:z
for +01:00
、%::z
for +01:00:00
1 和%:::z
for +01
// +01:30
(根据需要+01:30:01
添加多个:xx
))。
在ksh93
:
$ printf "%(%FT%T.%3N%z)T\n"
2018-07-01T13:44:07.043+0100
在zsh
:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME | IFS=. read s ns
$ strftime %FT%T.$ns[1,3]%z $s
2018-07-01T13:44:07.043+0100
可移植(最困难的部分是这里的毫秒,而不是您可以%z
在包装 standard²strftime()
函数的任何内容中获得的时区偏移量,例如date
),您可以尝试perl
:
perl -MTime::HiRes=gettimeofday -MPOSIX -le '
($s, $us) = gettimeofday;
$ms = sprintf("%03d", $us/1000);
print strftime "%FT%T.$ms%z", localtime $s'
1 是的,TZ 偏移量可以是非零秒,就像TZ='OFF00:00:01' date '+%Z %::z'
.对于现实生活中的时区,这只适用于遥远(Unix 之前)时间的日期。参见例如TZ=Europe/Amsterdam date -d '90 years ago' '+%F %::z'
² 但请注意,虽然%F
和%z
是在 POSIX 中指定的strftime()
(至少从 SUSv3 起),但它们不在date
实用程序的 POSIX 规范中(但我不知道当前有哪个系统date
不支持它们)
答案2
添加%z
到您的时间格式。例子:
$ date
Sun Jul 1 04:55:02 EDT 2018
$ date '+%z'
-0400
$
答案3
可以使用 GNU 日期获取 ISO8601 时间格式:
$ date -Iseconds
2018-07-01T06:57:25-0700
但是,要获取以毫秒为单位的时间,您需要指定详细的字符串。尝试:
$ date +'%Y-%m-%dT%H:%M:%S.%3N%z'
2018-07-01T06:57:28.457-0700