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)