Com GNU ou ast-open date
:
$ date +%FT%T.%3N%z
2018-07-01T13:44:07.043+0100
(GNU date
(não GNU strftime
) também suporta %:z
para +01:00
, %::z
para +01:00:00
¹ e %:::z
para +01
/ +01:30
/ +01:30:01
( quantos :xx
extra forem necessários)).
Em ksh93
:
$ printf "%(%FT%T.%3N%z)T\n"
2018-07-01T13:44:07.043+0100
Em 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
Portável (a parte difícil são os milissegundos aqui, não o deslocamento de fuso horário que você pode obter com %z
em qualquer coisa que envolva a função padrão% strftime()
como date
), você pode tentar perl
:
perl -MTime::HiRes=gettimeofday -MPOSIX -le '
($s, $us) = gettimeofday;
$ms = sprintf("%03d", $us/1000);
print strftime "%FT%T.$ms%z", localtime $s'
¹ Sim, é possível ter compensações de TZ com segundos diferentes de zero, como em TZ='OFF00:00:01' date '+%Z %::z'
. Para fusos horários da vida real, isso só se aplica a datas distantes (pré-Unix). Veja por exemplo TZ=Europe/Amsterdam date -d '90 years ago' '+%F %::z'
² Observe que enquanto %F
e %z
são especificados em POSIX strftime()
(pelo menos desde SUSv3), eles não estão na especificação POSIX do utilitário date
(não sei saber de qualquer sistema atual em que o date
não os apóia)